Скачать большие файлы с помощью Java - PullRequest
1 голос
/ 13 мая 2010

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

 resp.setHeader("Content-length", "" + fileLength);  
    resp.setContentType("application/vnd.ms-excel");  
    resp.setHeader("Content-Disposition","attachment; filename=\"export.mpr\"");  
    FileInputStream inputStream = null;  
 try  
 {  
    inputStream = new FileInputStream(path);  
    byte[] buffer = new byte[1024];  
    int bytesRead = 0;  

    do  
    {  
            bytesRead = inputStream.read(buffer, offset, buffer.length);  
            resp.getOutputStream().write(buffer, 0, bytesRead);  
    }  
    while (bytesRead == buffer.length);  

    resp.getOutputStream().flush();  
}  
finally  
{  
    if(inputStream != null)  
            inputStream.close();  
}  

Ответы [ 4 ]

3 голосов
/ 13 мая 2010

Я не знаю, связано ли это с вашей проблемой, но похоже, что вы не используете read() правильно. read() возвращает -1 в конце ввода и может считывать меньше указанного количества байтов, даже если доступно больше данных. Я бы порекомендовал вместо этого использовать

while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) {
    resp.getOutputStream().write(buffer, 0, bytesRead);
}

Ваш исходный код рискует прервать цикл чтения до окончания данных или вызвать write() с bytesRead, установленным в -1. Кроме того, переменная offset в вашем исходном коде кажется ненужной; смещение всегда должно быть 0, так как вы пытаетесь заполнить весь буфер.

0 голосов
/ 13 мая 2010

Какова среда вашего приложения? Я имею в виду, какой AppServer, WebServer и т. Д.

У меня была похожая проблема при обслуживании большого файла через комбинированные Apache Httpd и Tomcat. Мои клиенты использовали обычный веб-браузер, и я пытался отправлять фрагментированные данные. (Для очень больших файлов я читал кусок байтов и отправлял его клиенту).

Моя проблема была, вероятно, из-за соединения ajp, которое я использовал между httpd и tomcat. Я переключился с ajp на html-коннектор между ними, и это сработало как шарм.

0 голосов
/ 13 мая 2010

Используйте BufferedInputStream вместо FileInputStream, что дает вам больше возможностей и гибкости для чтения данных.

0 голосов
/ 13 мая 2010

Если вы получаете SocketException, проблема здесь не в коде, а в базовом сетевом протоколе. В этом случае «сломанный канал» означает, что вы теряете соединение с сервером - либо из-за зависания сервера, из-за нестабильного подключения к Интернету, либо из-за чего-то еще - и read выдает исключение, потому что оно случается, что метод пытается использовать это соединение в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...