PHP загрузчик около тысячи изображений? - PullRequest
4 голосов
/ 15 января 2010

Я работаю над сайтом, и мне нужен клиент, чтобы отправить мне около тысячи фотографий. Между нами существует небольшая географическая дистанция, поэтому отправка CD или SD-карты не является невозможной, но это не является предпочтительным. Могу ли я написать загрузчик PHP, чтобы клиент отправлял картинки, или есть лучший способ? Я не хочу подписываться на какие-либо сайты обмена файлами.

Предполагается, что я пишу такой загрузчик, есть ли способ кодировать Progresbar и / или некоторые другие функции, которые защищают от поврежденных файлов при прерывании загрузки?

Любые ссылки на ресурсы, которые помогают, являются плюсом.

Спасибо

EDIT:

Это разовая вещь, и мы обсуждаем эти высококачественные изображения. Это будет несколько ГБ.

Под FTP Space вы подразумеваете имя пользователя и pwd для моего FTP-сервера? Это можно сделать, но (почему) FTP-клиент лучше, чем веб-загрузчик? Я не уверен, что клиент знает, как или хочет загрузить программу FTP. Клиент на Mac, и я не доверяю нескольким FTP-программам для Mac, которые я видел.

Если я выберу маршрут "все в одном zip", будет ли работать PHP?

Еще раз спасибо.

EDIT:

Хорошо, пока я убежден, что не использовать PHP, если мы не используем файлы .zip. Кроме того, я, вероятно, пока оставлю индикатор выполнения. В ожидании клиента, свяжемся со всеми в ближайшие дни.

EDIT:

Познакомился с клиентом в какой-то функции. Там у клиента были фотографии на флешке. Задача решена. +1 для всех входных данных.

Ответы [ 5 ]

6 голосов
/ 15 января 2010

Я бы сказал, настроить некоторое пространство FTP или общий ресурс WebDAV. Если вы не можете сделать это, я бы загружал изображения в одном (или небольшом количестве) zip-файлах, вместо того, чтобы пытаться справиться с сотнями уникальных загрузок, что может занять очень много времени, так как браузеры будут выбирать только один файл. за один раз в диалоге загрузки файла (т.е. вы не можете просто выбрать весь каталог для загрузки).

Почему бы не использовать PHP в этом случае:

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

Если это файл размером в несколько ГБ, который вы хотите обработать, тогда загрузка HTTP - это не тот путь, по которому вы хотите (исходя из того, что если вам нужно спросить, почему, заставить его работать так, как вы хотите, вероятно, будет очень сложно процесс для вас).

В Mac OS имеется несколько превосходных FTP-клиентов, и нет никаких оснований полагать, что веб-браузер является лучшим способом передачи файлов, чем FTP-клиент.

Относительно поддержки индикатора выполнения:

Текущая поддержка индикатора выполнения очень ограничена в PHP (в настоящее время только через сторонние модули, которые немного волосатые), хотя я полагаю, что планируется включить модуль в стандартный дистрибутив. Поиск в Google для uploadprogress.so должен дать некоторые соответствующие результаты.

В ответ на littlegreen:

Я использовал это расширение http://pecl.php.net/package/uploadprogress (которому удалось конфликтовать хотя бы с одним уже установленным расширением - хотя я думаю, что они исправили эту проблему сейчас) и написал собственный обработчик javascript (http://iaincollins.com/javascript/FileUploader.js) на основе нескольких примеров в Интернете, чтобы объединить лучшие из них, например, используя невидимый iframe для прозрачного возврата процесса загрузки, создав диалоговое окно загрузки файла DHTML и заменив элемент управления загрузкой файлов на основе уродливого браузера, сделав он прозрачный и накладывается на него поверх моего собственного элемента управления (поэтому он по-прежнему можно было нажимать, поскольку вы не можете вызвать диалог загрузки файла из JavaScript, хотя вы можете получить имя файла, который был выбран для загрузки). Право CSS-стиля было особенно важно для этого - оно довольно специфично для браузера.

JS, который я написал, к сожалению, очень специфичен для конкретной ситуации, но в нем могут быть некоторые полезные элементы - извините, у меня нет ничего общедоступного, на которое я могу ссылаться, так как он был создан для частного интерфейса.

Я вижу, что теперь есть плагин jQuery для uploadprogress - он не делает все, но это было бы хорошим началом: http://nixbox.com/demos/jquery-uploadprogress.php ... Я помню лучшие примеры, в том числе тот, который был обработан несколько загрузок файлов (ставя их в очередь и выполняя их последовательно - вам все равно приходилось выбирать один файл за раз), но, к сожалению, я не могу их найти.

Вывод:

Я бы постарался избежать хлопот и сделать что-то вроде FTP-пространства или частного / однорангового приложения для передачи файлов, если у вас нет времени.

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

Хотя HTTP имеет возможность обрабатывать загрузку файлов, он не настолько надежен, и для загрузки файла размером в несколько ГБ необходимо явно настроить различные ограничения ресурсов (на веб-сервере и в PHP - как упомянуто выше). возможный. Даже с WebDAV (использующим HTTP для удаленной файловой системы) он прозрачен, но, как правило, он не такой надежный, как FTP, в основном из-за ошибочных реализаций клиента - в частности, могут возникать проблемы при передаче очень больших файлов как в Windows, так и в Mac OS, хотя Обычно это подходит для небольших (например, <500 МБ) передач файлов. </p>

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

4 голосов
/ 15 января 2010

Я бы предложил FTP, поскольку вы можете выполнять массовую загрузку, запускать / приостанавливать / останавливать и сохранять иерархию папок (при необходимости). FTP-решения для Mac великолепны; Я использую Transmission и Cyberduck. Филезилла тоже хороша.

Другим вариантом FTP будет использование клиентом Mac своего локального FTP-сервера, с которого вы можете загружать фотографии. Это потребует небольшой настройки, но определенно возможно.

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

Исключением для загрузки через браузер является использование загрузчика файлов на основе Flash, например SWFUpload . С его помощью ваш клиент может выбрать все файлы за один раз, после чего файлы будут поставлены в очередь и выгружены по очереди в ваш серверный скрипт (который может быть на PHP). Фактически, я использовал это для той же самой цели - позволить клиенту отправлять мне файлы.

Сказав это, я все еще рекомендую FTP в этом случае.

2 голосов
/ 15 января 2010

Мне просто нужно было решить аналогичную проблему для клиента. Они регулярно заставляют своих клиентов загружать на них кучу файлов общим объемом 300-400 Мб, обычно через FTP. Однако один клиент имел брандмауэр и не мог использовать FTP. И поэтому мне пришлось кодировать HTTP-загрузчик.

Я искал в Интернете решение для PHP и нашел в основном те же вещи, о которых уже говорил Иан Коллинз: 1) PHP возможен, но проблематичен и 2) Поддержка индикатора выполнения для PHP плохая. Я могу рассказать вам немного подробнее об ограничениях загрузки / размера, с вами все будет в порядке, если вы включите в веб-каталог файл .htaccess, содержащий следующий код, который должен дать вам ограничение загрузки 3 ГБ и неограниченное выполнение скрипта. время, пока ваш веб-хост поддерживает установку значений PHP conf в файлах htaccess:

php_value upload_max_filesize 3000M
php_value post_max_size 3000M
php_value max_execution_time 0
php_value max_input_time 0

Кодирование сценария загрузки является относительно простым. Хороший учебник найден здесь .

Использование индикатора выполнения более сложно. Индикатор выполнения только для PHP невозможен без установки расширений. Общепринятым вариантом является использование гибридного Perl / PHP-решения , которое, однако, требует от вас выполнения сценариев CGI на вашем сервере. Я не могу, поэтому я пропустил индикатор выполнения. Это очень недружелюбно для клиента, потому что он довольно долго смотрит на неподвижный экран, думая, что браузер заблокирован, и если он каким-то образом закроет его или потеряет подключение к Интернету, ему придется начинать все сначала.

Загрузка нескольких файлов одновременно также сложна. Используя расширенный элемент управления выбором файлов и AJAX, чтобы открыть несколько одновременных сеансов загрузки, вы можете проделать долгий путь, но у вас останется та же проблема: если произойдет сбой из-за какого-то странного имени файла, переполнения диска или потери соединения, клиент будет придется начинать заново, но на сервере уже будет куча файлов. Кодирование удобного решения для резюме - непростая задача. Я бы посоветовал вам позволить клиенту архивировать свои файлы и загружать их оптом.

Поскольку это разовая вещь, я бы посоветовал вам не беспокоиться о написании собственного решения и использовать уже имеющиеся инструменты. Почему бы вам не позволить вашему клиенту использовать FTP, например MAC-версия FileZilla ? Или DropBox ? Или как насчет того, чтобы позволить ему загружать файлы в Google Docs , что с недавних пор позволяет загружать и делиться любым файлом размером до 100 МБ?

2 голосов
/ 15 января 2010

Независимо от количества файлов, о каком количестве данных мы говорим?

Если вас беспокоит количество файлов, просто попросите клиента сжать их. Вы можете распаковать zip на сервере и поместить изображения туда, куда им нужно.

Кроме того, спросите себя, будет ли это происходить регулярно, или это нерегулярное обслуживание или одноразовая задача запуска? Если это так, вы сэкономите время и деньги себе и своему клиенту, просто обмениваясь файлами по ftp или другим способом.

0 голосов
/ 19 января 2011

Вы могли бы рассмотреть SWFUpload (http://code.google.com/p/swfupload/),, которая является библиотекой Flash и Javascript, чтобы сделать загрузку намного проще. Она имеет встроенную поддержку PHP и .Net, так что она, вероятно, удовлетворит ваши потребности.

Я использовал его для 1000 изображений за один сеанс загрузки.

...