Вопрос

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

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

Пожалуйста, предложите.

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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 int.) Нашими клиентами являются как Flex, так и curl.Это работает для меня, это может сработать для вас.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top