Http проблема загрузки Java-файла - PullRequest
2 голосов
/ 01 июня 2011

При попытке загрузить файл с помощью библиотеки apache httpclient возникла проблема с тем, что результирующий файл меньше исходного (примерно 32-32 КБ, когда нормальный размер файла 92-93) и не может быть нормально открыт в средстве просмотра PDF.Может кто-нибудь объяснить мне, почему это может происходить?(Использование Firefox для загрузки этого файла иногда может привести к полной загрузке файла, а иногда к частичной загрузке)

Вот код, который я использовал для загрузки файла по URL

    URL url = new URL("pathtofile");
    final URLConnection connection = url.openConnection();

    final InputStream is = connection.getInputStream();
    FileOutputStream fos = new FileOutputStream("C://result1.pdf");

    byte buffer[] = new byte[1024];
    int bytesRead; 
    while ((bytesRead = is.read(buffer)) >= 0) {        
        fos.write(buffer, 0, bytesRead);
    }
    fos.flush();
    fos.close();
    is.close();

PS Пыталсязагрузка этого файла с использованием библиотеки Apache HttpClient, тот же результат.

ОБНОВЛЕНО: Отслеживание трафика с помощью сетевого инструмента Я обнаружил разницу между получением файла через Firefox и приложением.

С Firefox первый HttpPayloadLine был:

HTTPPayloadLine: 83 Td /F2 5.80476 Tf (A:\040Asinis\04017.12.10\04008:32\040laboratorij) Tj 100 Tz 1 1 1 rg /F1 5.80476 Tf 0 0 0 rg 104.4856 0 Td <0145> Tj 1 1 1 rg 0 0 0 rg 3.62799 0.72565 Td /F2 5.80476 Tf (\040) Tj 1 1 1 rg 0.83137 0.81569 0.78431 RG ET 51

С первым приложением HttpPayload был

HTTPPayloadLine: CWgC,ú&ÿ3@Î"ݯV¨®~×>×)\ªleÚl µï½ci ¤Ãðð'È / CÈAø¯ª101 übA«1Ãÿ Åç«VɬZòYóóy7»ÇH.o²e<qZna3l±°¥þ6ñþ[2YÚ1ì³Eë-ÓÊÏ$y:tÎà![ËÅS¤¿É¡¢è,þ|ºs¨)@¢Qâ¯ÝF~}oµÒ>¦ OAxz³äÒ.ß9 æÃZ¤ùÒ¨*«øUή+4×

Это измерение было выполнено с помощью Microsoft Network Monitor

LAST UPDATE В конце концов, это была проблема с сервером после того, как они исправили успешную загрузку файлов

Ответы [ 4 ]

3 голосов
/ 01 июня 2011

Попробуйте изменить на

while ((bytesRead = in.read(buffer)) != -1) {
 byte[] tmp = ArrayUtils.subarray(buffer, 0, bytesRead);
 fos.write(tmp);
}

Вы получаете обратно 0 байт, но это не означает, что оно завершено. Также записываются только те байты, которые вы получили, но не буфер.

0 голосов
/ 02 июня 2011

Можете ли вы использовать org.apache.commons.io.FileUtils.copyURLToFile(URL, File) вместо?

0 голосов
/ 01 июня 2011

Возможно, чтение потока ошибок может дать вам некоторую информацию:

connection.getErrorStream();
0 голосов
/ 01 июня 2011

Первое, что я заметил, это то, что вы проверяете, верен ли is.read(buffer) > 0, что неверно, поскольку может (теоретически, по крайней мере) возвращать 0, даже если он не достиг конца файла. InputStream.read() вернет -1 при достижении EOF, поэтому проведите это сравнение >= 0.

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

byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while ( (bytesRead = in.read(buffer)) >= 0 ) {
    out.write(buffer, 0, bytesRead);
}
...