使用 Apache HttpClient 下载文件

ret*_*dos 3 java apache download httpclient

我想做的是使用 httpclient 下载文件。目前我的代码如下。

    HttpClient client = HttpClientBuilder.create().build();
    HttpGet request = new HttpGet(downloadURL);     


    HttpResponse response = client.execute(request);

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        FileOutputStream fos = new FileOutputStream("C:\\file");
        entity.writeTo(fos);
        fos.close();
    }
Run Code Online (Sandbox Code Playgroud)

我的下载网址是这样的:http://example.com/file/afz938f348dfa3

正如您所看到的,该文件没有扩展名(至少在网址中),但是,当我使用普通浏览器访问该网址时,它确实会下载文件“asdasdaasda.txt”或“asdasdasdsd.pdf”(名称与网址不同,扩展名并不总是相同,取决​​于我尝试下载的内容)。

我的 http 响应如下所示:

日期:2017 年 5 月 29 日星期一 14:57:14 GMT 服务器:Apache/2.4.10 内容处置:附件;filename="149606814324_testfile.txt" 接受范围:字节 缓存控制:public,max-age=0 最后修改时间:2017 年 5 月 29 日星期一 14:29:06 GMT Etag:W/"ead-15c549c4678-gzip" 内容-类型:文本/纯文本;字符集 = UTF-8 变化:接受编码 内容编码:gzip 内容长度:2554 保持活动:超时 = 5,最大 = 100 连接:保持活动

我怎样才能让我的java代码自动下载具有良好名称和扩展名的文件到特定文件夹中?

Ovi*_*lha 5

您可以从响应的标头中获取文件名和扩展名content-disposition

首先获取标头,然后解析它的文件名,如下所述,即:

HttpEntity entity = response.getEntity();
if (entity != null) {
    String name = response.getFirstHeader('Content-Disposition').getValue();
    String fileName = disposition.replaceFirst("(?i)^.*filename=\"([^\"]+)\".*$", "$1");
    FileOutputStream fos = new FileOutputStream("C:\\" + fileName);
    entity.writeTo(fos);
    fos.close();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

更正式的方法是使用 HeaderElements API:

    Optional<String> resolveFileName(HttpResponse response) {
        return Arrays.stream(response.getFirstHeader("Content-Disposition").getElements())
                .map(element -> element.getParameterByName("filename"))
                .filter(Objects::nonNull)
                .map(NameValuePair::getValue)
                .findFirst();
    }
Run Code Online (Sandbox Code Playgroud)