2009-07-06 2 views
1

Я знаю, что такие вопросы существуют в SF, но они очень специфичны, мне нужно общее предложение. Мне нужна функция для загрузки пользовательских файлов, размер которых может быть больше 1 ГБ. Эта функция будет дополнением к существующей функции загрузки файлов, присутствующей в приложении, которая обслуживает более мелкие файлы. Ниже приведены некоторые из вариантов:Предложения по загрузке очень больших (> 1 ГБ) файлов

  1. Использование HTTP и Java-апплетов. Отправляйте файлы в куски и присоединяйтесь к ним на сервере. Но как дросселировать н/д.
  2. Используйте приложение HTTP и Flex. Это лучше, чем апплет с совместимостью браузера & с любыми другими проблемами окружающей среды?
  3. Использование FTP или SFTP, а вместо HTTP в качестве протокола для ускорения процесса загрузки

Пожалуйста Suggest.

Кроме того, я должен убедиться, что этот процесс загрузки не мешает работе других пользователей или, другими словами, не съедает ч/б других пользователей. Любые механизмы, которые могут быть выполнены на уровне n/w для дросселирования таких процессов?

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

ответ

0

Для отправки файлов на сервер, если у вас нет , есть, чтобы использовать HTTP, FTP - это путь. Дросселирование, я не совсем уверен, по крайней мере, не программно.

Лично мне кажется, что ограничения скорости загрузки будут лучше выполняться на стороне сервера.

12

Используйте любой язык на стороне клиента, который вы хотите (приложение Java, Flex и т. Д.), И нажмите на сервер с помощью HTTP PUT (без Flex) или POST. В коде Java на стороне сервера регулируйте поток байтов в контуре потока ввода. Сырой, простой, образец фрагмент кода, который не ограничивает пропускную способность не быстрее, чем в среднем < = 10KB/секунду:

InputStream is = request.getInputStream(); 
OutputStream os = new FileOutputStream(new File("myfile.bin")); 
int bytesRead = 0; 
byte[] payload = new byte[10240]; 

while (bytesRead >= 0) { 
    bytesRead = is.read(payload); 

    if (bytesRead > 0) 
     os.write(payload, 0, bytesRead); 

    Thread.currentThread().sleep(1000); 
} 

(С дополнительной сложности можно более точно регулировать единую пропускную способность потока, но он получает комплекс при рассмотрении . сокетов буферы и такие «достаточно хорошо», как правило, достаточно хорошо)

Мое приложение делает что-то подобное выше. - мы регулируем как вверх (POST и PUT) и (GET) вниз пропускную способность потока. Мы принимаем файлы в 100 МБ каждый день и тестировали до 2 ГБ. (За пределами 2 ГБ есть досадные Java-примитивные проблемы, с которыми приходится иметь дело.) Наши клиенты - это Flex и curl. Он работает для меня, он может работать на вас.

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

3

Если вы хотите уменьшить пропускную способность, вы можете отправить сжатые данные (если только не сжаты). Это может сэкономить в 2-3 раза больше объема данных в зависимости от того, что вы отправляете.

1

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

Они предоставляют различные варианты, включая загрузку формы HTTP, клиентский десктоп java или какой-то гаджет, управляемый javascript, который я не могу понять , Кажется, они нигде не используют вспышку.

Смежные вопросы