Отправка большого файла по сети

Сначала мои извинения за длинное описание. Но я изо всех сил стараюсь довести дело до конца.

Цель состоит в том, чтобы сгруппировать отдельные файлы с общим размером 50 МБ и отправить несколько файлов по 50 МБ каждый. Потому что я не хочу отправлять очень маленький файл по сети индивидуально. кроме того, отправка всех сразу не поможет, так как размер объединенных файлов может быть слишком большим.

Например, если я прикреплю 4 файла размером 50 МБ каждый, то общий размер будет 200 МБ, что слишком велико для отправки. Таким образом, вместо того, чтобы отправлять 200 МБ за один раз, отправьте только кратные 50 МБ один за другим, поэтому прокручивайте список файлов и измеряйте размер каждого файла, если он составляет ‹ 50 МБ, затем добавляйте его в список отправки, поэтому продолжайте добавлять отдельные файлы, пока он не достигнет 50 МБ, поэтому один раз он достигает 50 МБ, а затем отправляет этот файл_список. Продолжайте перебирать file_list и делайте то же самое для остальных файлов.

Что я пробовал:

Предположим, что список_файлов содержит 4 файла, т. е. 50 МБ, 40 МБ, 30 МБ, 20 МБ.

Collections.sort(files, new Comparator<File>() {
    @Override
    public int compare(File  fileOne, File  fileTwo) {
        return  fileOne.getSize() - fileTwo.getSize();//Sorting Asc.
    }                   
});

Integer total = 0;
ArrayList<File> files = new ArrayList<File>();
for(File file:files) {
    total = total + file.getSize();  
    if(total <= 51200 ) { //51200KB = 50MB          
        files.add(file);    
            if(total == 51200) { 
            send(files);
            files = new ArrayList<File>();
            total = 0;
            }
    } else {
        send(files);
        files = new ArrayList<File>();
        total = 0;
    }       
}
if(files.size() > 0)
    send(files);

Но отсутствует файл размером 30 МБ выше - что не так с этой логикой?


person grek    schedule 17.04.2015    source источник
comment
Я бы не стал заморачиваться. Ваша оценка, что 200 МБ «слишком велики для отправки», совершенно произвольна. Я бы использовал для этого хороший FTP-клиент с возможностью возобновления работы и вообще не писал никакого кода.   -  person user207421    schedule 17.04.2015
comment
Правильно - это совершенно произвольно. Я использую портлет Spring MVC, а также прикрепляю и отправляю файлы асинхронно, используя AJAX, файлы отправляются в приложение среднего уровня через веб-службы для обработки.   -  person grek    schedule 17.04.2015
comment
Вы реализовали этот код или это псевдокод, я нахожу здесь много ошибок, реализация компаратора неверна. Вы создаете экземпляр файлов и перебираете один и тот же экземпляр ArrayList‹File› files = new ArrayList‹File›(); for(Файл файл:файлы)   -  person Karthik Prasad    schedule 17.04.2015
comment
Имейте в виду - проверяйте файл при извлечении, а не тогда, когда он уже получен!   -  person Yuri    schedule 17.04.2015


Ответы (1)


Заменить строку

if(total = 51200)

со следующим:

if(total == 51200)

total = 51200 - это не оператор сравнения, это скорее присваивание, которое отклоняется от вашей логики, которую вы намереваетесь реализовать.

Надеюсь, это поможет.

person Nirmal    schedule 17.04.2015
comment
не нужно извиняться ... инструменты редактора кода, которые могли бы ловить такие вещи, были бы хороши. - person Nirmal; 17.04.2015