Очень большие загрузки с PHP - PullRequest
37 голосов
/ 14 мая 2009

Я хочу разрешить загрузку очень больших файлов в наше PHP-приложение (сто мегабайт - 8 гигабайт). Однако есть несколько проблем с этим.

Браузер:

  • HTML-загрузки имеют дрянную обратную связь, нам нужно либо опросить о прогрессе (что немного глупо), либо вообще не показывать никакой обратной связи
  • Flash Uploader помещает весь файл в память перед началом загрузки

Сервер:

  • PHP заставляет нас устанавливать post_max_size, что может привести к легко эксплуатируемой DOS-атаке. Я бы не хотел устанавливать этот параметр глобально.
  • Сервер также требует наличия некоторых других переменных в переменных POST, таких как секретный ключ. Мы хотели бы иметь возможность отклонить запрос сразу, а не после загрузки всего файла.

Требования:

  • HTTP является обязательным.
  • Я гибок с технологией на стороне клиента, если она работает в браузере.
  • PHP не является обязательным требованием, если есть какая-то другая технология, которая будет хорошо работать в среде Linux, это прекрасно.

Ответы [ 13 ]

14 голосов
/ 14 мая 2009

upload_max_filesize может быть установлено для каждого каталога ; то же самое касается post_max_size

например:.

<Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>
7 голосов
/ 09 мая 2012

Я знаю, что она старая, но, может быть, у кого-то такая проблема и сегодня. Теперь вы можете сделать это только с помощью Javascript и, скажем, PHP. На стороне клиента не требуется Flash или Java.

демо: http://dnduploader.filkor.org/

Идея состоит в том, чтобы нарезать файлы с помощью метода Javascript Blob slice () ...

7 голосов
/ 14 мая 2009

Обработчик Python?

Использование обработчика POST Python вместо PHP. Создайте уникальный идентификатор из вашего приложения PHP, который клиент может вставить в заголовки HTTP. С mod_python, чтобы отклонить или принять большую загрузку перед передачей всего тела POST.

Я думаю http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html

Позволяет проверять заголовки и отклонять остальную часть ввода POST. Я не пробовал, но может быть правильный путь?

Глядя на источник mod_python, буферизация ввода с помощью read (), кажется, позволяет поочередно оценивать ввод HTTP. Заголовки являются первыми.

https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c

3 голосов
/ 14 мая 2009

Как насчет Java-апплета? Вот как мы должны были сделать это в компании, в которой я раньше работал. Я знаю, что апплеты отстойные, особенно в наше время, со всеми доступными опциями, но они действительно являются наиболее универсальным решением для настольных проблем, возникающих в веб-разработке. Просто кое-что рассмотреть.

2 голосов
/ 23 июля 2009

Взгляните на jumploader.com

Хороший java-апплет для загрузки.

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

2 голосов
/ 02 июня 2009

Пробовал все это ... это лучшее, что я когда-либо использовал ...

http://www.uploadify.com/

2 голосов
/ 14 мая 2009

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

Используйте это с APC, и вы сможете найти что-то хорошее: Рабочая статья IBM Developer по APC

1 голос
/ 15 мая 2009

У меня был успех с uploadify , и я бы порекомендовал его. Это скрипт jQuery / Flash, который обрабатывает большие загрузки, и вы можете передать ему дополнительные параметры (например, секретный ключ). Чтобы решить проблемы на стороне сервера, просто используйте следующий код. Изменения вступают в силу только для сценария, в который они вызваны:

//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
    exit("Invalid request");
}
function isValid($key)
{
    //Put your validation code here.
}

//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);

//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");

//Generally speaking, the memory_limit should be higher
//than your post size.  So make sure that's right too.
ini_set("memory_limit","8200M");

РЕДАКТИРОВАТЬ В ответ на ваш комментарий:

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

Как ты сам сказал, это простой протокол. Помимо написания собственного клиентского программного обеспечения, работающего вне браузера, Java-апплета или использования другого протокола (например, FTP, который был разработан для этого), вы можете не получить то, что хотите.

Я сделал все, что мог в данных ограничениях. Извините, я не мог сделать лучше.

1 голос
/ 14 мая 2009

Я бы посмотрел на FTP, SSH или SCP , это позволяет загружать большой файл и при этом иметь контроль доступа к файлу. Это может занять немного больше времени для реализации, но это, пожалуй, самый безопасный способ, о котором я мог подумать.

1 голос
/ 14 мая 2009

Может быть, вы могли бы использовать Webdav и Javascript в браузере

AJAX Загрузка большого файла с прогрессом в WebDAV

http://www.webdavsystem.com/ajax/programming/upload_progress

Простая библиотека

http://debris.demon.nl/projects/davclient.js/doc/README.html

Затем вы можете заставить JS перенаправить пользователя на страницу успеха. Секретные ключи и что-не может быть обработано в прелюдии PHP перед передачей JS Client-> WebDAV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...