2016-03-23 2 views
0

Я пишу программу для загрузки PDF-файла с сервера. Я использую некоторую программу, приведенную здесь Download file by passing URL using java code, это решение отлично подходит для образца URL, предоставленного в первом ответе, но не для PDF, я заменяю только URL. Ниже мой код.скачать pdf с помощью java

import java.io.*; 
import java.net.*; 

public class FileDownloadTest { 
    final static int size = 1024; 

    public static void fileUrl(String fAddress, String localFileName, String destinationDir) { 

     // localFileName = "Hello World"; 
     OutputStream outStream = null; 
     URLConnection uCon = null; 

     InputStream is = null; 
     try { 
      URL url; 
      byte[] buf; 
      int byteRead, byteWritten = 0; 
      url = new URL(fAddress); 
      outStream = new BufferedOutputStream(new FileOutputStream(destinationDir + "\\" + localFileName)); 

      uCon = url.openConnection(); 
      is = uCon.getInputStream(); 
      buf = new byte[size]; 
      while ((byteRead = is.read(buf)) != -1) { 
       outStream.write(buf, 0, byteRead); 
       byteWritten += byteRead; 
      } 
      System.out.println("Downloaded Successfully."); 
      System.out.println("File name:\"" + localFileName + "\"\nNo ofbytes :" + byteWritten); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
       outStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void fileDownload(String fAddress, String destinationDir) { 
     int slashIndex = fAddress.lastIndexOf('/'); 
     int periodIndex = fAddress.lastIndexOf('.'); 

     String fileName = fAddress.substring(slashIndex + 1); 

     if (periodIndex >= 1 && slashIndex >= 0 && slashIndex < fAddress.length() - 1) { 
      fileUrl(fAddress, fileName, destinationDir); 
     } else { 
      System.err.println("path or file name."); 
     } 
    } 

    public static void main(String[] args) { 
     String fAddress = "http://singztechmusings.files.wordpress.com/2011/09/maven_eclipse_and_osgi_working_together.pdf"; 
     String destinationDir = "D:\\FileDownload"; 
     fileDownload(fAddress, destinationDir); 

    } 
} 

Здесь Это PDF 73 страниц, и в моей папке, это загрузить в формате PDF из 1KB, при открытии в Acrobat Reader, это говорит о том, что файл может быть поврежден.

Я также пробовал код, приведенный здесь https://dzone.com/articles/java-how-save-download-file, но результат такой же.

, пожалуйста, дайте мне знать, как я могу это исправить.

Благодаря

ответ

1

Если проверить загруженное содержимое файла, вы можете увидеть это HTML. Сервер перенаправляет исходный запрос на https url. Используйте url https: //singztechmusings.files.wordpress.com/2011/09/maven_eclipse_and_osgi_working_together.pdf вместо этого.

Или использовать HTTP-клиент с автоматической обработкой редиректа, ала http-commons

+0

Привет Мандис. Wohooooooooo. Это работало потрясающе. У меня есть быстрый вопрос, если я добавлю '' 'на' http' сайты будут работать? – user3872094

+0

№. Сайт должен поддерживать протокол https, а также контент может отличаться при использовании http vs https. Лучшим решением будет использование http-клиента, который автоматически перенаправляет перенаправления, например [http-commons] (https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/fundamentals.html#d5e334) , –

0

Вы определяете переменную size = 1024 и использовать это, чтобы определить свой буфер. Итак, логично вы можете написать только 1 КБ. Но если входной поток читается больше сразу, он будет потерян ... Поэтому измените размер буфера на значение, которое сможет содержать большинство документов или попытаться определить необходимый размер.

+0

Спасибо за предложение, http://stackoverflow.com/questions/36173363/download-a-pdf-using-java/#36173522 Работал для меня – user3872094

+0

@ikarus, если вы посмотрите на код более точно, вы увидите что буфер используется в цикле копирования. Таким образом, ничего не теряется. Однако значение буфера 1024 может считаться небольшим, и я бы рекомендовал более высокое значение для повышения производительности. – mkl

+0

@mkl oh, конечно, спасибо за информацию. это было смешно, так как я написал свою последнюю программу java и просто забыл, что массивы «знают свой размер», поэтому «read (buf)» знает, когда остановиться. – ikarus

Смежные вопросы