Упс мы столкнулись с некоторыми проблемами загружаемый файл слишком большой
Многие сталкивались с проблемой при закачке файлов, что сервер упорно пытается загрузить слишком большие для нас файлы и этот процесс не только тормозит пользователя, заставляя его понапрасну долго ждать, но и загружает сам сервер, на который происходит закачка файла.
- ограничить закачку файла настройками самого PHP
- ограничить закачку файла используя механизмы отправки запроса формы на сервер (только методом POST)
Мне бы хотелось рассмотреть именно его.
Итак, начнем с того, что укажем в форме method="post" и enctype="multipart/form-data" . Далее создадим скрытый элемент формы
<input type="hidden" name="MAX_FILE_SIZE" value="1111111">
В значении элемента MAX_FILE_SIZE указываем нужный нам максимальный размер в байтах загружаемых файлов.
Особое внимание нужно обратить на то, что этот элемент должен стоять ДО полей выбора файлов (например, сразу после тега form):
Пример:
<form method="post" . enctype="multipart/form-data">
<input type="hidden" name="max_file_size" value="1111111">
.
<input type="file" name="photo" >
.
</form>
Что происходит на практике (хотя некоторые конфигурации PHP и Apache запрещают данный метод):
PHP получает первым делом наш параметр ограничения размера файлов. Далее считывает его значение, далее «сбрасывает» элементы массива $_FILES, где размер файла превышал необходимый.
Пример того, что он творит с таким элементом:
Array ( [photo] => Array ( [name] => my_photo.jpg [type] => [tmp_name] => [error] => 2 [size] => 0 )
Как видим он ставит для такого элемента код ошибки отличный от 0 (0 = удачная загрузка), данная ошибка гласит: «The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form» или «Размер загруженного файла превысил значение MAX_FILE_SIZE, установленное в HTML форме».
- некоторые браузеры могут (пользуясь данной директивой) сами обрывать закачку файла на сервер (природа данного эффекта мне лично не известна и в документациях браузеров про нее не нашел)
- это НЕ обязательная директива для браузеров
- в браузерах данное ограничение можно легко обойти
- в Mozilla Firefox (тестировалось на версиях 2 и 3) ограничение на стороне браузера не срабатывало
- в IE начиная с 6ой версии (на ниже версиях не тестировал) и Opera (начиная с 8.5ой версии) работало
в теории (сам не проверял) параметр ограничение через форму MAX_FILE_SIZE приоритетнее параметра upload_max_filesize в php.ini
ЗЫ: Надеюсь, данная статья поможет многим кодерам, особенно тем, кто не имеет прав сервера на изменение настроек PHP на сервере.
ЗЗЫ: В своем топике я просто хотел описать один из механизмом и свой опыт его использования. Это не в коем случае НЕ пособие к обязательным действиям, так как он всего лишь является дополнительным, в каких-то случаях удобным, механизмом проверки.
ЗЗЗЫ: Отредактирован с учетом выссказываний, пожеланий, споров и советов в комментариях.
Какой файл будет считаться «слишком большим»? Это зависит от нескольких факторов:
- Размер файла больше, чем вы хотите принимать (или принимает файловая система)
- При загрузке файла происходит PHP таймаут (из-за размера файла)
- Файловая система не имеет достаточного места
- И т.д.
Вне зависимости от происходящих событий вы должны быть в состоянии сделать следующее:
Файл слишком большой для WordPress
Как было отмечено выше, то, как вы определяете, является ли файл слишком большим для данной системы, зависит от многочисленных переменных окружения.
По этой причине я не могу вам предложить пример, который бы покрывал абсолютно все существующие сценарии, однако есть общий план действий, которому вы можете следовать, внеся лишь требуемые изменения в реализацию в зависимости от вашего варианта использования. Таким образом, в примере, приведенном ниже, я покажу общий случай структурирования кода для обслуживания сценария с загрузкой слишком больших файлов.
1. Задаем хук уведомлений.
Далее идет обычный ООП-код для WordPress:
Это обычное определение класса, в котором имя хука задано в конструкторе, а актуальная функция определена в классе. В нашем случае нам нужно будет немного поработать над подцепляемой функцией, чтобы определить, является ли файл слишком большим.
2. Проверяем размер файла на этапе загрузки
Обратите внимание: следующая функция предполагает, что вы уже имеете правильную обработку, позволяющую определить, заполнен ли массив $_FILES. Т.е., если пользователь пытается загрузить файл, но ничего не задает, то это уже отдельный случай для обработки.
В нашем случае пользователь предоставил файл, поэтому мы делаем следующее:
Наличие private функции, вычисляющей размер файла (есть и другие способы проверки типа и размера файла, но это выходит за рамки данной статьи), делает код намного более читабельным.
Я не говорю, что это – лучший способ задания проверки, но я действительно считаю, что когда дело доходит до поддержания кода – т.е. чтения его и работы с ним спустя месяцы или годы, – такой подход будет более простым.
3. Вывод ошибки (или загрузка файла).
Во всяком случае, это стандартная установка, которой я пользуюсь при необходимости проверить, является ли загружаемый файл слишком большим. Ваш подход может быть – и, скорее всего, будет – несколько иным, однако иметь общий фундамент для проведения операций всегда полезно.
Доброго дня!
Какое здесь может быть решение ?
"Файл слишком велик для конечной файловой системы" — пример ошибки при записи большого видео на флешку
Способы решения
Вариант 1 // перезагрузка файла
Если речь идет о каких-то очень популярных видео (фильмы, сериалы) — то одним из простых вариантов может стать загрузка того же фильма в более низком качестве (например, вместо 2160p — выбрать 1080p). Разумеется, файл будет меньше весить и ошибки не возникнет!
Вариант 2 // разделение видео на 2-3 куска
Если ваше видео весит больше 4 ГБ (например, как в моем случае 4,6 ГБ ☝) — то его можно разделить на 2-3 куска и уже их спокойно записать на флешку. Благо, что делается это относительно быстро и не сложно! Покажу на примере.
Нарезка видео - Видеомонтаж
Далее указать наше "большое" видео.
После сдвинуть правый ползунок примерно в центр экрана и нажать по кнопке "Новый фрагмент" .
В результате получится, что наше видео было разделено на два примерно равных фрагмента ( причем : время конца у первого ролика совпадает со временем начала второго!).
Важный момент : если у вас видео весит больше, чем мое, скажем, 9 ГБ, — то вам его нужно разделить примерно поровну на 3 части! (делается аналогично!). Т.е. главное, чтобы каждая часть весила меньше 4 ГБ!
Время конца у первого ролика совпадает со временем начала второго!
Сохранить в исходном формате
Кстати, в моем случае получилось 2 файла, каждый из которых чуть более 2 ГБ (первоначальный файл был на 4,6 ГБ). Разумеется, они были записаны на флешку.
2 одинаковых по размеру файла (большой файл был разбит)
Вариант 3 // форматирование и конвертация файловой системы
1) Этот способ подойдет только тем, у кого на флешке/диске нет важных для него файлов! ( Примечание : при форматировании накопителя — вся информация с него удаляется!)
2) Если вы будете флешку подключить к ТВ/плееру — имейте в виду, не все из них видят файловую систему NTFS!
*
Чтобы отформатировать флешку — нужно:
Выбор файловой системы NTFS
Вместо форматирования можно провести операцию конвертирования (т.е. преобразования FAT32 в NTFS). Правда, здесь есть свои "НО", о которых стоит сразу сказать:
- эта операция (в идеале/теории) не приводит к потери данных - все файлы остаются нетронутыми ( на практике : нередко, что часть файлов перестает читаться, некоторые имена каталогов и файлов отображаются крякозябрами и т.д. В общем, никаких гарантий, что пройдет все гладко. );
- процесс конвертации может сильно затянуться по времени (заранее предсказать, сколько это займет — довольно трудно);
- крайне нежелательно прерывать операцию (если во время процесса "моргнет" свет - данные можно потерять. ).
Как конвертировать FAT32 в NTFS:
- запустить командную строку от имени админа;
- ввести команду convert G: /fs:ntfs и нажать Enter (вместо "G:" — нужно указать свою букву флешки) ;
Пример команды convert — командная строка
Если вам нужно разместить на флешку какой-нибудь образ, установочный файл (размер которого более 4 ГБ) и т.д. (и его нельзя с помощью редактора видео разрезать на 2-3 части ) — можно поступить иначе.
Минус способа : требуется время на создание архива (и последующей его распаковки).
Плюс : годится для любых файлов / типов накопителей.
Настройки создания многотомного архива
Что делать, если файл слишком велик для конечной файловой системы
Если вам не важна файловая система накопителя
В случае, если файловая система флешки или диска для вас не принципиальна, вы можете просто отформатировать его в NTFS (данные будут потеряны, способ без потери данных описан далее).
- В проводнике Windows нажмите правой кнопкой мыши по накопителю, выберите пункт «Форматировать».
- Укажите файловую систему NTFS.
- Нажмите «Начать» и дождитесь завершения форматирования.
После того, как диск будет иметь файловую систему NTFS, ваш файл на него «поместится».
В том случае, когда нужно конвертировать накопитель из FAT32 в NTFS без потери данных, можно использовать сторонние программы (бесплатная Aomei Partition Assistant Standard умеет это и на русском языке) или использовать командную строку:
convert D: /fs:ntfs (где D — буква конвертируемого диска)
И уже после конвертирования скопировать необходимые файлы.
Если флешка или диск используется для ТВ или другого устройства, которое не «видит» NTFS
В ситуации, когда вы получаете ошибку «Файл слишком велик для конечной файловой системы» при копировании фильма или другого файла на флешку, используемую на устройстве (ТВ, iPhone и т.п.), которое не работает с NTFS, есть два способа решить проблему:
- Если это возможно (для фильмов обычно возможно), отыскать другой вариант этого же файла, который будет «весить» меньше 4 Гб.
- Попробовать отформатировать накопитель в ExFAT, с большой вероятностью он будет работать на вашем устройстве, а ограничения на размер файла не будет (точнее будет, но не то, с которым вы сможете столкнуться).
Когда требуется создать загрузочную флешку UEFI, а образ содержит файлы больше 4 Гб
Как правило, при создании загрузочных флешек для систем UEFI используется файловая система FAT32 и нередко случается, что не удается записать файлы образа на флешку, если он содержит install.wim или install.esd (если речь о Windows) более 4 Гб.
Решить это можно следующими методами:
- Rufus умеет записывать флешки UEFI в NTFS (подробнее: загрузочная флешка в Rufus 3), но потребуется отключить Secure Boot. умеет разбивать файлы больше 4 Гб на файловой системе FAT32 и «собирать» их уже при установке. Функция заявлена в версии 1.6 beta Сохранилось ли она в более новых версиях — не скажу, но с официального сайта можно загрузить именно указанную версию.
Если нужно сохранить файловую систему FAT32, но записать файл на накопитель
В случае, когда нельзя выполнить никаких действий по преобразованию файловой системы (накопитель нужно оставить в FAT32), файл требуется записать и это не видео, которое можно было бы найти в меньшем размере, вы можете разбить этот файл с помощью любого архиватора, например, WinRAR, 7-Zip, создав многотомный архив (т.е. файл будет разбит на несколько архивов, которые после распаковки снова станут одним файлом).
Более того, в 7-Zip можно и просто разбить файл на части, без архивации, а в дальнейшем, когда это будет необходимо, соединить их в один исходный файл.
Надеюсь, предложенные способы подойдут в вашем случае. Если же нет — опишите ситуацию в комментарии, я постараюсь помочь.
Читайте также: