Упс мы столкнулись с некоторыми проблемами загружаемый файл слишком большой

Обновлено: 07.07.2024

Многие сталкивались с проблемой при закачке файлов, что сервер упорно пытается загрузить слишком большие для нас файлы и этот процесс не только тормозит пользователя, заставляя его понапрасну долго ждать, но и загружает сам сервер, на который происходит закачка файла.

  1. ограничить закачку файла настройками самого PHP
  2. ограничить закачку файла используя механизмы отправки запроса формы на сервер (только методом 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 одинаковых по размеру файла (большой файл был разбит)

2 одинаковых по размеру файла (большой файл был разбит)

Вариант 3 // форматирование и конвертация файловой системы

1) Этот способ подойдет только тем, у кого на флешке/диске нет важных для него файлов! ( Примечание : при форматировании накопителя — вся информация с него удаляется!)

2) Если вы будете флешку подключить к ТВ/плееру — имейте в виду, не все из них видят файловую систему NTFS!

*

Чтобы отформатировать флешку — нужно:

Форматировать — проводник

Выбор файловой системы NTFS

Выбор файловой системы NTFS

Вместо форматирования можно провести операцию конвертирования (т.е. преобразования FAT32 в NTFS). Правда, здесь есть свои "НО", о которых стоит сразу сказать:

  1. эта операция (в идеале/теории) не приводит к потери данных - все файлы остаются нетронутыми ( на практике : нередко, что часть файлов перестает читаться, некоторые имена каталогов и файлов отображаются крякозябрами и т.д. В общем, никаких гарантий, что пройдет все гладко. );
  2. процесс конвертации может сильно затянуться по времени (заранее предсказать, сколько это займет — довольно трудно);
  3. крайне нежелательно прерывать операцию (если во время процесса "моргнет" свет - данные можно потерять. ).

Как конвертировать FAT32 в NTFS:

  1. запустить командную строку от имени админа;
  2. ввести команду convert G: /fs:ntfs и нажать Enter (вместо "G:" — нужно указать свою букву флешки) ;

Пример команды convert — командная строка

Пример команды convert — командная строка

Если вам нужно разместить на флешку какой-нибудь образ, установочный файл (размер которого более 4 ГБ) и т.д. (и его нельзя с помощью редактора видео разрезать на 2-3 части ) — можно поступить иначе.

Минус способа : требуется время на создание архива (и последующей его распаковки).

Плюс : годится для любых файлов / типов накопителей.

Настройки создания многотомного архива

Настройки создания многотомного архива

Что делать, если файл слишком велик для конечной файловой системы

Файл слишком велик для конечной файловой системы — ошибка

Если вам не важна файловая система накопителя

В случае, если файловая система флешки или диска для вас не принципиальна, вы можете просто отформатировать его в NTFS (данные будут потеряны, способ без потери данных описан далее).

Форматирование в NTFS для больших файлов

  1. В проводнике Windows нажмите правой кнопкой мыши по накопителю, выберите пункт «Форматировать».
  2. Укажите файловую систему NTFS.
  3. Нажмите «Начать» и дождитесь завершения форматирования.

После того, как диск будет иметь файловую систему NTFS, ваш файл на него «поместится».

В том случае, когда нужно конвертировать накопитель из FAT32 в NTFS без потери данных, можно использовать сторонние программы (бесплатная Aomei Partition Assistant Standard умеет это и на русском языке) или использовать командную строку:

convert D: /fs:ntfs (где D — буква конвертируемого диска)

И уже после конвертирования скопировать необходимые файлы.

Если флешка или диск используется для ТВ или другого устройства, которое не «видит» NTFS

В ситуации, когда вы получаете ошибку «Файл слишком велик для конечной файловой системы» при копировании фильма или другого файла на флешку, используемую на устройстве (ТВ, iPhone и т.п.), которое не работает с NTFS, есть два способа решить проблему:

  1. Если это возможно (для фильмов обычно возможно), отыскать другой вариант этого же файла, который будет «весить» меньше 4 Гб.
  2. Попробовать отформатировать накопитель в ExFAT, с большой вероятностью он будет работать на вашем устройстве, а ограничения на размер файла не будет (точнее будет, но не то, с которым вы сможете столкнуться).

Когда требуется создать загрузочную флешку UEFI, а образ содержит файлы больше 4 Гб

Как правило, при создании загрузочных флешек для систем UEFI используется файловая система FAT32 и нередко случается, что не удается записать файлы образа на флешку, если он содержит install.wim или install.esd (если речь о Windows) более 4 Гб.

Решить это можно следующими методами:

  1. Rufus умеет записывать флешки UEFI в NTFS (подробнее: загрузочная флешка в Rufus 3), но потребуется отключить Secure Boot. умеет разбивать файлы больше 4 Гб на файловой системе FAT32 и «собирать» их уже при установке. Функция заявлена в версии 1.6 beta Сохранилось ли она в более новых версиях — не скажу, но с официального сайта можно загрузить именно указанную версию.

Если нужно сохранить файловую систему FAT32, но записать файл на накопитель

В случае, когда нельзя выполнить никаких действий по преобразованию файловой системы (накопитель нужно оставить в FAT32), файл требуется записать и это не видео, которое можно было бы найти в меньшем размере, вы можете разбить этот файл с помощью любого архиватора, например, WinRAR, 7-Zip, создав многотомный архив (т.е. файл будет разбит на несколько архивов, которые после распаковки снова станут одним файлом).

Более того, в 7-Zip можно и просто разбить файл на части, без архивации, а в дальнейшем, когда это будет необходимо, соединить их в один исходный файл.

Разбить большой файл в 7-Zip

Надеюсь, предложенные способы подойдут в вашем случае. Если же нет — опишите ситуацию в комментарии, я постараюсь помочь.

Читайте также: