Снятие ограничений на размер загружаемого файла
Чтобы настроить установку LAMP (Linux, Apache, MySQL, PHP), которая позволяет пользователю загружать большие файлы на свой сервер, необходимо сделать следующее:
Измените следующие переменные в php.ini
memory_limit
= 1000M - установить ограничение памяти на то, что доступно в системе
post_max_size
= 4G - убедитесь, что это значение больше или равно значению upload_max_filesize
upload_max_filesize
= 4G - установите это на то, что вы хотите, чтобы максимум был
upload_tmp_dir:
/mnt/raid10/Files/Temp
- по умолчанию это отключено, что делает временное расположение на том же диске, где установлена ОС. В моем случае запускать все с Raspberry Pi, что делает его SD-картой. Чтобы иметь меньше ограничений, я установил вместо этого местоположение моего сетевого диска.
После выполнения вышеизложенного ограничение размера загружаемого файла - это физическая память, доступная для устройства, независимо от того, что установлено для memory_limit
, и ограничения файловой системы (4 ГБ для файловой структуры FAT). В случае моего Raspberry Pi 3 это было 1 ГБ.
Обход ограничения памяти для загрузки файла, превышающего объем доступной памяти
Единственный способ преодолеть ограничение памяти - разделить загрузку. После включения чанкинга во время загрузки происходит следующее:
- Загрузка начата на веб-странице.
- Данные из исходного файла передаются в память веб-сервера.
- Данные сбрасываются из памяти веб-сервера во временное местоположение файла.
- Как только временный файл достигает установленного размера порции, эти данные сбрасываются в файл конечного расположения и временный файл удаляется.
- Повторите шаг 2, пока файл не будет завершен.
Как использовать чанкинг
Если вы используете обработчик загрузки, похожий на этот (https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php), то доступно множество встроенных опций.
В моем случае, когда объявлена #fileupload, я добавил строку для maxChunkSize
:
$('#fileupload').fileupload({
maxChunkSize: 10 * 1024 * 1024, // 10 MB <-----This is the line I added
add: function (e, data) {
blah blah blah
}
});
}
});
Какое бы значение здесь ни ставилось, будет использоваться размер чанка. Выбранный вами размер требует небольших экспериментов, так как небольшой размер значительно замедлит скорость загрузки, а слишком большой размер приведет к тому, что пользователь сайта не будет видеть прогресс на своей панели прогресса в течение достаточно долгого времени. Для меня 10МБ было счастливым носителем.
* Обратите внимание, что индикатор выполнения для загрузки будет перемещаться только при запуске каждого чанка, поэтому он становится более изменчивым, чем приятный непрерывный индикатор выполнения, но я на самом деле с этим согласен.