当前位置: 首页 > 知识库问答 >
问题:

使用ApacheHttpClient下载文件

咸利
2023-03-14

我想做的是用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();
    }

我的下载URL如下所示:http://example.com/file/afz938f348dfa3

正如你可以看到没有扩展名的文件(至少在网址)然而,当我去一个正常的浏览器网址,它下载文件asdasdaasda.txt或asdasdasdsd.pdf(名称是不同的url和extenstion并不总是相同的,取决于我试图下载什么)。

我的http响应如下所示:

日期:2017年5月29日星期一14:57:14 GMT服务器:Apache/2.4。10内容处置:附件;filename=“14906814324_testfile.txt”接受范围:字节缓存控制:公共,最大年龄=0上次修改时间:2017年5月29日星期一14:29:06 GMT Etag:W/“ead-15c549c4678-gzip”内容类型:文本/普通;字符集=UTF-8变化:接受编码内容编码:gzip内容长度:2554保持活动状态:超时=5,最大=100连接:保持活动状态

我如何做到这一点?我的java代码会自动下载特定文件夹中具有良好名称和扩展名的文件?

共有3个答案

齐甫
2023-03-14

Java11代码下载文件使用java.net.http.HttpClient

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

...

public static void downloadFile(String productId) throws IOException, InterruptedException {
        String url = "https://sameer-platform.com/v1/products/" + productId + "/download/model";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();

        // Creates new File at provided location user.dir and copies the filename from Content-Disposition
        HttpResponse<Path> response = client.send(request,
                HttpResponse.BodyHandlers.ofFileDownload(Path.of(System.getProperty("user.dir")),
                        StandardOpenOption.CREATE, StandardOpenOption.WRITE));

        System.out.println(response.statusCode());
        System.out.println(response.headers());
        Path path = response.body();
        System.out.println("Path=" + path); // Absolute Path of downloaded file
    }
岳炎彬
2023-03-14

更正式的方法是使用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();
    }
仲孙诚
2023-03-14

您可以从响应的内容处置标题中获取文件名和扩展名

首先获取标题,然后按照此处的说明解析文件名,即:

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();
}
 类似资料:
  • 问题内容: 我正在尝试使用asyncTask下载文件,但无法正常工作,没有错误消息或什么都没有,只是不下载文件…我尝试了所有操作,但似乎并没有输入…任何人都知道可以是问题吗?我在手机上测试过,网址也可以。 问题答案: 我只运行了您的代码,它对我来说很好用。该图像已下载到sdcard。 请注意,请确保在AndroidManifest.xml中设置了以下权限: 这是我得到的日志(请注意,我添加了):

  • 问题内容: 我编写了一些代码来下载我所做的网络广播的一集。它获取剧集的URL,并获取保存它的位置。但是,它最多只能下载16MB,然后自动取消。我不完全确定要增加此值需要更改什么值。是否可以,有人可以指出正确的方向吗?谢谢! 下载代码: 问题答案: 快速查看transferFrom的文档: 好。 计数的值1 << 24(来自原始问题)等于16M 我想这就是您的问题的答案:-)

  • 问题内容: 我需要提供下载文件的链接,任何用户都必须隐藏该链接并且可以访问该链接,这是我的代码,没有任何错误,但是我什至无法打开下载对话框: 模板 脚本文件 问题答案: 首先,您不能“隐藏/不公开”基于Web的技术(HTML / CSS / JavaScript)应用程序中的链接。下载是由客户端处理的,因此Download / Link-URL必须是公共的。您可以尝试使用后端执行的编程语言(例如“

  • 我有一个CSV文件的URL,我可以在浏览器中下载并打开该文件,而不会出现问题。 我正在尝试使用电源外壳下载此文件,但没有成功。我尝试使用,和使用web命令对象,但没有运气。

  • 我们提供资源包、CDN 服务、 Npm 包、Bower 包 的形式来获得所需的文件或源代码。 一、文件下载 1、资源包 我们提供完整的 Highcharts 资源包,包含实例文件、所有的 js 压缩版及源码等。 到我们的 下载中心 页面即可获取最新的资源包。 解压下载得到的压缩包,进入相应的目录查看所有包含文件,Highcharts 提供的文件目录如下图所示: 目录结构说明: |-- examp

  • 问题内容: 我在这里指定了非常相似的要求。 我需要让用户的浏览器在以下情况下手动开始下载 但是我无法使用该方法,因为它将当前页面内容替换为您尝试下载的文件。 相反,我想在新窗口/选项卡中打开下载。这怎么可能? 问题答案: 使用不可见的: 要强制浏览器下载本来可以呈现的文件(例如HTML或文本文件),则需要服务器将文件的MIME类型设置为无意义的值,例如或另外,用于任意二进制数据。 如果只想在新标签