Очень большие загрузки с помощью PHP
Я хочу разрешить загрузку очень больших файлов в наше приложение PHP (сотни мегабайт - 8 концертов). Однако есть несколько проблем с этим.
Браузер:
- Загрузка HTML имеет дрянную обратную связь, нам нужно либо опросить прогресс (что немного глупо), либо вообще не показывать обратную связь
- Flash-загрузчик помещает весь файл в память перед началом загрузки
Сервер:
- PHP заставляет нас устанавливать post_max_size, что может привести к легкодоступной атаке DOS. Я бы не хотел устанавливать этот параметр глобально.
- Сервер также требует наличия других переменных в голосах POST, таких как секретный ключ. Мы хотели бы сразу отказаться от запроса, а не после загрузки всего файла.
Требования:
- HTTP является обязательным.
- Я гибкий с клиентской технологией, если она работает в браузере.
- PHP не является обязательным требованием, если есть какая-то другая технология, которая будет хорошо работать в среде linux, это отлично.
Ответы
Ответ 1
Как насчет апплета Java? Это как мы должны были сделать это в компании, над которой я раньше работал. Я знаю, что апплеты сосать, особенно в наши дни и со всеми нашими возможностями, но они действительно являются самым универсальным решением для настольных задач, возникающих в веб-разработке. Просто подумать.
Ответ 2
upload_max_filesize можно установить для каждой директории; то же самое можно сказать о post_max_size
например:.
<Directory /uploadpath/>
php_value upload_max_filesize 10G
php_value post_max_size 10G
</IfModule>
Ответ 3
Обработчик 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(), по-видимому, позволяет оценивать входные данные по протоколу bit-at-time. Заголовки первыми.
https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c
Ответ 4
Это старое, что я знаю, но, возможно, у кого-то эта проблема и сегодня.
Теперь вы можете сделать это только с Javascript и, скажем, с PHP. На стороне клиента не требуется Flash или Java.
demo: http://dnduploader.filkor.org/
Идея состоит в том, чтобы разрезать файлы с помощью метода Javascript Blob slice()...
Ответ 5
Вы можете установить post_max_size только для сценариев в 1 каталоге. Разместите свою загрузку script и разрешите только script обрабатывать большие размеры. По-прежнему возможно, что этот script будет атакован большими/бесполезными файлами, но он избегает установки его по всему миру.
Используйте это с APC, и вы, возможно, сможете что-то придумать:
IBM Developer работает над APC
Ответ 6
Пробовал все это... это, безусловно, лучшее, что я использовал еще...
http://www.uploadify.com/
Ответ 7
Взгляните на jumploader.com
Хороший java-апплет для загрузки.
Я использовал его для загрузки изображений, и он отлично работает. Не пробовал с большими файлами, чем 10 МБ, но я должен работать и для действительно больших файлов.
Ответ 8
Вы изучили использование APC для проверки прогресса и общего размера файла. Ниже приведено хорошее сообщение в блоге. Это может помочь.
Ответ 9
Возможно, вы могли бы использовать 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
Ответ 10
Я бы посмотрел на FTP, SSH или SCP, это позволяет загружать большой файл и по-прежнему контролировать доступ к файлу, Это может занять немного больше времени, но это, вероятно, самый безопасный способ, о котором я мог думать.
Ответ 11
У меня был успех с uploadify, и я бы порекомендовал его. Это jQuery/Flash script, который обрабатывает большие загрузки, и вы можете передать ему дополнительные параметры (например, секретный ключ). Чтобы решить проблемы на стороне сервера, просто используйте следующий код. Изменения влияют только на script, на которые они вызваны:
//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 right too.
ini_set("memory_limit","8200M");
EDIT В ответ на ваш комментарий:
Учитывая то, что вы сказали, я боюсь, что вы не сможете удовлетворить свои требования по сравнению с http. Все решения там - это код, который добавляет функции к http, для которых он никогда не предназначался.
Как вы сказали сами, это простой протокол. Помимо написания собственного клиентского программного обеспечения, которое выполняется за пределами браузера, java-апплета или другого протокола (например, FTP, который был разработан для этого), вы можете не получить то, что хотите.
Я сделал все, что мог, в рамках заданных ограничений. Извините, я не мог сделать лучше.
Ответ 12
Я знаю, что это заставляет добавить другую зависимость, но, по моему опыту, большинство веб-сайтов, которые делают что-то вроде этого, используют flash на стороне клиента и загружают большой файл в виде фрагментов
adobe как howto для загрузки файлов флэш
Я также нашел этот учебник по codeproject:
Несколько загрузки файлов с помощью панели выполнения Использование Flash и ASP.NET
PS - Я знаю, что вы используете PHP, а не .net, я понял, что важной частью была вспышка;)
Ответ 13
Попробуйте следующее: http://www.simple2ftp.com использует Java-апплет на основе Java из умной оболочки PHP-приложения.