Загрузка файла Java с использованием сокета, Требуется процент загруженного файла?

1

Привет, я загружаю файл на сервер, используя сокет, и мне нужен процент загруженного файла? Как я могу это сделать? У меня есть максимальное значение, то есть длина файла, как я могу получить, сколько файлов было загружено?

FileInputStream fis = new FileInputStream(fil);
                BufferedInputStream in = new BufferedInputStream(fis);
                BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream());

                //Write the file to the server socket           
                int i;

                while ((i = in.read()) != -1) {
                    publishProgress(???);
                    out.write(i);                   
                    System.out.println(i);
                }

Мне нужно передать длину файла, расширенного в методе publishProgress.

  • 0
    Читайте о шаблонах Слушатель-Наблюдатель. PublishProgress в этом случае, вероятно, выплюнул бы группу слушателей, все из которых подписаны. В этот момент у вас есть свой ответ.
Теги:
sockets

4 ответа

1
Лучший ответ

с использованием буферизованного копирования

FileInputStream fis = new FileInputStream(fil);
BufferedInputStream in = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream());

//Write the file to the server socket
int i;
int written = 0;
byte[] buf = new byte[512];

while ((i = in.read(buff)) != -1) {  

    out.write(buff,0,i);
    written += i;
    publishProgress((double)written/length);
    //passing a double value from 0-1 to say how much is transmitted (length is length of file)
    System.out.println(buff+", "+i);
}
  • 0
    эй, используя ваш in.read (бафф), моя скорость загрузки увеличилась .. спасибо очень много ... и вы можете объяснить, пожалуйста, причину увеличения скорости?
  • 2
    потому что побайтная передача означает, что вы должны пройти цикл n раз (n - размер файла), который должен проверять для каждого байта, является ли он концом, должен ли выводить поток очищаться и печатать значение. Но использование буфера, как я показал, означает, что через цикл передаются фрагменты длиной до 512 байт, и вышеупомянутые издержки не только один раз prr chunk
0

javax.swing.ProgressMonitorInputStream

0

Ниже приведен ваш модифицированный код. написанное содержит количество int, записанных в сокет.

FileInputStream fis = new FileInputStream(fil);
BufferedInputStream in = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream());

//Write the file to the server socket           
int i;
int written = 0;

while ((i = in.read()) != -1) {  

    out.write(i);               
    publishProgress(++written);
    System.out.println(i);
}
0

Для этого вам нужно сделать одну из двух вещей:

  • Используйте Flash-загрузчик, например swfupload (см. http://demo.swfupload.org/Documentation/), поскольку они обычно обеспечивают доступ к загрузке этого типа.
  • Предоставьте собственный обратный канал: выполните форму submit с помощью Ajax, а затем во время отправки формы вы запустите таймер javascript, который отображает URL-адрес на сервере с ключом, который соответствует загрузке. URL-адрес сервера проверяет, какая часть файла была загружена и возвращает это число, и передайте это до вашего метода uploadProgress.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню