6

我如何能够在 Java 中使用 HttpResponse 处理下载?我向特定站点发出了 HttpGet 请求 - 该站点返回要下载的文件。我该如何处理这个下载?InputStream 似乎无法处理它(或者我可能以错误的方式使用它。)

4

3 回答 3

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) {}
        }
    }

}

在这里工作正常。你的问题出在其他地方。

于 2010-04-13T21:02:52.327 回答
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" );
}
于 2010-04-13T20:44:16.587 回答
0

一般来说,当您希望浏览器显示要下载文件的下载对话框时,您应该将传入的inputstream内容直接设置到响应对象流中,并将响应(HttpServletResponse对象)的内容类型设置为相关的文件类型。

IE,

response.setContentType(.. relevant content type)

内容类型可以是application/pdfpdf 文件为例。

如果浏览器有插件可以在浏览器窗口中显示相关文件,文件将打开并保存,否则浏览器将显示下载框。

于 2010-04-13T20:41:09.683 回答