2010-04-13 73 views
6

如何在Java中使用HttpResponse處理下載?我向特定站點發出HttpGet請求 - 站點返回要下載的文件。我該如何處理這個下載? InputStream似乎無法處理它(或者我錯誤地使用它)。使用Java處理下載

+3

你在說什麼API /庫? [Apache HttpComponents HttpClient v4](http://hc.apache.org/httpcomponents-client/index.html)?如果你不知道,請提及你正在談論的'HttpResponse'和'HttpGet'類的包名,最好發佈一個[SSCCE](http://sscce.org),以便我們發現你的錯誤。 – BalusC 2010-04-13 20:35:30

+0

的確我在使用Apache HttpComponents。你發佈的答案似乎是我正在尋找的。但是,是否有可能將所有輸入存儲爲字符串與實際文件?我的輸入流轉換爲字符串方法使用緩衝讀取器,但它給了我空。 – Tereno 2010-04-13 23:11:57

回答

8

假設你實際上是在談論HttpClient,這裏是一個SSCCE

package com.stackoverflow.q2633002; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class Test { 

    public static void main(String... args) throws IOException { 
     System.out.println("Connecting..."); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet("http://apache.cyberuse.com/httpcomponents/httpclient/binary/httpcomponents-client-4.0.1-bin.zip"); 
     HttpResponse response = client.execute(get); 

     InputStream input = null; 
     OutputStream output = null; 
     byte[] buffer = new byte[1024]; 

     try { 
      System.out.println("Downloading file..."); 
      input = response.getEntity().getContent(); 
      output = new FileOutputStream("/tmp/httpcomponents-client-4.0.1-bin.zip"); 
      for (int length; (length = input.read(buffer)) > 0;) { 
       output.write(buffer, 0, length); 
      } 
      System.out.println("File successfully downloaded!"); 
     } finally { 
      if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} 
      if (input != null) try { input.close(); } catch (IOException logOrIgnore) {} 
     } 
    } 

} 

工作在這裏很好。你的問題在別的地方。

+0

我將內容類型添加到頭(Application/octet-stream)和使用相同的方法,似乎有伎倆。 – Tereno 2010-04-13 23:25:04

0

通常,當您希望瀏覽器顯示要下載的文件的下載對話框時,您應該將傳入的inputstream內容直接設置爲響應對象steam並將響應的內容類型(對象HttpServletResponse)設置爲相關的文件類型。

response.setContentType(.. relevant content type) 

內容類型可以是application/pdf爲PDF文件,例如,

如果瀏覽器有一個插件在瀏覽器窗口中顯示相關文件,文件將打開,用戶可以保存,否則瀏覽器將顯示下載框。

+0

公平的猜測,但他不是在談論Servlet API :) – BalusC 2010-04-13 20:42:07

+0

嗯......我認爲我因爲httpresponse提及而被帶走了。對不起:) – Fazal 2010-04-13 21:18:52

1

打開一個流併發送文件:

try { 
    FileInputStream is = new FileInputStream(_backupDirectory + filename); 
    OutputStream os = response.getOutputStream(); 
    byte[] buffer = new byte[65536]; 
    int numRead; 
    while ((numRead = is.read(buffer, 0, buffer.length)) != -1) { 
     os.write(buffer, 0, numRead); 
    } 
    os.close(); 
    is.close(); 
} 
    catch (FileNotFoundException fnfe) { 
    System.out.println("File " + filename + " not found"); 
}