2010-01-15 2 views
3

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

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

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

Благодаря

EDIT:

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

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

Предполагая, что я возьму маршрут «все в одном почтовом ящике», будет ли работать PHP?

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

EDIT:

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

EDIT:

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

ответ

5

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

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

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

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

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

Что касается поддержки прогресса:

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

В ответ на littlegreen:

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

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

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

Вывод:

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

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

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

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

+0

+1 для подробного ответа. –

+3

Есть решения, основанные на вспышке, такие как www.swfupload.org. Они великолепны, но, как и PHP, не созданы для тысяч файлов и огромных объемов данных. FTP или P2P - это, безусловно, правильный путь. –

+1

Да, стоит упомянуть. Обычно я предпочитаю не использовать Flash-варианты, если это возможно, но в этом случае стоит упомянуть, поскольку они более сложны, чем использование стандартного подхода к загрузке файлов в HTML, и я ожидаю, что обработка больших файлов будет намного лучше, чем большинство браузеров на их собственные. Я создал действительно гладкие дескрипторы файлов на основе DHTML в PHP + JS раньше, но это определенно только для посвященных, поскольку требуется справедливый бит хакера, если вам нужен сложный интерфейс с поддержкой кросс-браузера (roll on HTML5!). –

2

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

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

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

+0

Самый популярный/тщательный ответ – Moshe

4

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

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

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

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

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

2

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

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

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

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

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

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

+0

+1 Для подробного ответа с полезной информацией, что я был слишком ленив, чтобы найти и вставить в 8) –

+0

Просто совпадение, что у меня была информация. Я провел последние несколько дней глядя на все это для веб-сайта, над которым я работаю :) – thomaspaulb

0

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

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