Подтвердить что ты не робот

Очень большие загрузки с помощью PHP

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

Браузер:

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

Сервер:

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

Требования:

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

Ответ 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-приложения.