Загрузка файлов HTTP 4 ГБ с использованием jQuery-File-Upload, Apache и PHP - программирование
Подтвердить что ты не робот

Загрузка файлов HTTP 4 ГБ с использованием jQuery-File-Upload, Apache и PHP

Эта проблема, похоже, напрямую связана с печально известным лимитом 2 ГБ, и я не уверен в этом, если его проблема с 32-битным PHP. Я видел комментарии, связанные с HTTP, которые не предназначены для таких больших файлов. Тем не менее, я предпочел бы исчерпать это направление, прежде чем принимать решение о каких-либо фундаментальных изменениях в отношении того, что было доказано в настоящее время. Как следует из названия, мне нужно загрузить > 2 ГБ файлов, самый большой на сегодняшний день 3,8 ГБ. У меня есть форма, построенная с использованием jQuery-file-upload, у которой не было проблем с отправкой каких-либо файлов (все меньше и меньше 2 ГБ) до тех пор, пока не начнутся эти большие. 3,8 ГБ занимает около 5 минут для загрузки из файла-загрузки, а индикатор выполнения достигает 100%. Однако сообщенная ошибка после загрузки является типом 1, который предполагает ограничение размера файла.

Если я отслеживаю использование диска на сервере во время загрузки, он будет иметь следующие свойства образца: Перед загрузкой диска используется 30%, так как загрузка продолжается, это увеличение увеличивается, 31%, 32%.... 45%, 46% и т.д. Однако примерно в 2 Гбайт точки использования диска снижаются до 30%, тогда как загрузка файлов клиент/браузер продолжается. Когда использование дискового пространства серверов перестает увеличиваться, клиент может получить только 60% загрузки. Тем не менее клиент по-прежнему остается на 100%, но не принимается сервером, так как состояние диска никогда не отключается на 30%.

Я запускаю 64Bit Ubuntu (последний) с Apache/2.2.22 (Ubuntu) и PHP версии 5.3.10-1ubuntu3.2 После многодневного поиска и поиска решения я все равно не могу загрузить файл 3.8GB после изменения так много настроек. Я приведу список изменений ниже, но на этом этапе я думаю, что это может быть 32-битная проблема с PHP, поэтому, если кто-то может предложить ссылку, стоящую за ней или ее решение, я бы это оценил.

В Apache2 я установил следующее:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 4939212390
    - php_value upload_max_filesize 4831838208
    - php_value post_max_size 4939212390

В php.ini я установил следующее:

- UPLOAD_MAX_FILESIZE 4831838208
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

Если я запустил на сервере следующее: кажется, что у PHP нет 32-разрядной проблемы, но я не уверен на этом этапе.

php -r "echo PHP_INT_MAX;"
9223372036854775807

Как я уже говорил, любые идеи были бы весьма полезны.

UPDATE:

Решили эту проблему, поэтому благодаря @BogdanBurim за то, что вы предложили обратный подход к основам:

Мне удалось загрузить файл размером 3,8 ГБ по HTTP со следующими настройками:

В Apache2 я установил следующее:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390

В php.ini я установил следующее:

- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

Единственной важной частью этого решения было удаление MAX_FILE_SIZE, HTML из формы загрузки:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />

Наличие этого набора постоянно вызывало ошибку типа PHP 2, поэтому php не смог обработать установленное более 32-битное целое число. Удаление этого вызвало ошибки PHP типа 1, пока я не изменил UPLOAD_MAX_FILESIZE на 0 всюду, и hey presto теперь работает!!!!

http://php.net/manual/en/features.file-upload.errors.php

4b9b3361

Ответ 1

Решили эту проблему, поэтому благодаря @BogdanBurim за то, что вы предложили обратный подход к основам:

Мне удалось загрузить файл размером 3,8 ГБ по HTTP со следующими настройками:

В Apache2 я установил следующее:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390

В php.ini я установил следующее:

- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

Единственной важной частью этого решения было удаление MAX_FILE_SIZE, HTML из формы загрузки:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />

Наличие этого набора постоянно вызывало ошибку типа PHP 2, поэтому php не смог обработать установленное более 32-битное целое число. Удаление этого вызвало ошибки PHP типа 1, пока я не изменил UPLOAD_MAX_FILESIZE на 0 всюду, и hey presto теперь работает!!!!

http://php.net/manual/en/features.file-upload.errors.php

Ответ 2

Если у вас есть доступ к конфигурации apache virtualhost, вы также можете изменить эти настройки для определенного URL-адреса загрузки (вы также можете добавить это в свой файл .htaccess):

С помощью этого кода:

<LocationMatch "/index.php/url-of-your-upload.php">
    php_value max_execution_time 0
    php_value upload_max_filesize 0
    php_value post_max_size 4939212390
    php_value memory_limit 4G
    LimitRequestBody 0
</LocationMatch>

Директивы LocationMatch позволяют вам выбирать URL-адрес (вы можете использовать reg exp)

Ответ 3

Вопрос в том, почему вы используете свой браузер для загрузки > 1 ГБ. Подумайте о том, что самые распространенные службы обмена файлами имеют максимальный размер загрузки файлов до 1 ГБ через браузер. Что произойдет, если пользователь-загрузка завершится неудачей, вам придется перезапустить весь процесс.

Вы искали альтернативы, если у вас есть такие большие загрузки файлов, торренты, ftp или личный клиент для загрузки, такие как rapidshare, fileupload, megaupload и т.д. Есть.

Вы ограничены из-за ограничения размера файла, установленного на POST. Если вы решите использовать HTTP для загрузки больших файлов, которые я бы обескураживал, оптимальным решением было бы разделение файла и загрузка меньших разделенных частей, а затем повторная сборка файла.