Intereting Posts
Разрешить доступ к файлу PHP только через ajax на локальном сервере Сравните группу тегов, чтобы найти сходство / оценку с помощью PHP / MySQL PHP :: DOTNET загружает каждую ошибку загрузки страницы Поиск наивысшего ключа / индекса в массиве Разделение строк в PHP и получение последней части Каковы хорошие, быстрые постоянные параметры хранения данных key-> value? Многоуровневый доступ к массиву PHP SQL: как выбрать одну запись в день, предполагая, что каждый день содержит более 1 значения MySQL Как вызвать скрипт PHP с использованием AJAX внутри функции переключения JQuery? Как получить значения из массива с помощью метода POST INSERT – PHP и SQL Server Как отобразить текущую версию рабочей копии hg-репозитория на странице PHP PHP-массив с значениями url для нового массива с комбинированными значениями Область действия функции PHP PHP: лучший способ повторить два параллельных массива?

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

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

Браузер:

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

Сервер:

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

Требования:

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

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

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

например:

<Directory /uploadpath/> php_value upload_max_filesize 10G php_value post_max_size 10G </IfModule> 

Обработчик 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

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

demo: http://dnduploader.filkor.org/

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

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

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

Пробовал все это … это, безусловно, лучшее, что я использовал еще …

http://www.uploadify.com/

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

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

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

Вы изучили использование APC для проверки прогресса и общего размера файла. Вот хорошее сообщение в блоге об этом. Это может помочь.

Возможно, вы можете использовать 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

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

У меня был успех с добавлением , и я бы рекомендовал его. Это сценарий 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"); 

EDIT В ответ на ваш комментарий:

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

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

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

Я знаю, что это отстой, чтобы добавить другую зависимость, но, по моему опыту, большинство веб-сайтов, которые делают что-то вроде этого, используют flash на стороне клиента и загружают большой файл в виде кусков

adobe как способ загрузки флеш-файлов

Я также нашел этот учебник по codeproject:

Множественная загрузка файлов с помощью панели выполнения Использование Flash и ASP.NET

PS – Я знаю, что вы используете PHP, а не .net, я понял, что важной частью была вспышка;)

Попробуйте это: http://www.simple2ftp.com использует Java-апплет на основе Java из умной оболочки PHP-приложения.