Я хочу разрешить загрузку очень больших файлов в наше приложение PHP (сотни мегабайт – 8 концертов). Однако есть пара проблем с этим.
Браузер:
Сервер:
Требования:
Как насчет апплета 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
Пробовал все это … это, безусловно, лучшее, что я использовал еще …
Взгляните на 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-приложения.