java如何从https下载链接中下载文件

10 篇文章 0 订阅
9 篇文章 0 订阅

java如何从https下载链接中下载文件

从https 下载文件会存在什么用的问题?

普通的http下载非常的简单,无需做任何处理,可以直接用 URL.openStream获取或者restTempate 请求获取。

而https 涉及到证书的问题,(有些网站的https的证书已经在jdk中的信任行列也可以直接下载)jdk没有将证书导入信任行列会报如下异常:

找不到那样的下载链接无法模拟,后面遇到在补.....

导入安全证书到jdk

  1. 首先下载该链接的安全证书。如何下载安全证书?点击浏览器左上角https旁边的按钮,点击“证书(有效)” 点击上方tab栏的详细信息 -> 点击下方复制到文件 如何就一直下一步直到保存到你的磁盘上。
  2. cmd输入下面的命令:
keytool -import -v -trustcacerts -alias 导入的证书别名 -file 证书在磁盘的文件地址 -storepass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts

这里需要注意的是 $JAVA_HOME/lib/security/cacerts 的默认的密码是:changeit
3. 然后会让你是否信任该证书,输入"y"即可

下载文件

java下载文件有很多种方式,这里提供简单的两种方式作为参考

URL 获取inputStream

 InputStream inputStream = new URL(downLoadUrl).openStream();

Spring 的 restTemplate 方法发送请求

用Spring 的restTemplate 接收传输流需要注意的一些问题

  1. 使用 byte[] 作为 responseType
  2. 参数中 Object… uriVariables 这些参数是作为链接上的参数,如下面的,k1=v1,k2=v2:
http://localhost:8080/file/downLoadFromUrl?k1=v1&k2=v2
  1. 如果是body里面的传参,可以使用如下形式:

这里需要注意的是 multiValueMapput方法value是一个list,如果是添加单个值要用add方法,详情见MultiValueMap源码

MultiValueMap multiValueMap = new LinkedMultiValueMap();
multiValueMap.add("k","v");
ResponseEntity<byte[]> responseEntity = restTemplate.postForEntity(downLoadUrl,multiValueMap,byte[].class,"");
  1. 接收到的byte[]之后,传入 ByteArrayInputStream 转为流然后在输出为文件即可。

完整案例:

package com.example.demo.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

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

/**
 * @author Mr.Lemon
 * @title: FileController
 * @projectName demo
 * @description:
 * @date 2019/4/18 21:25
 */
@RestController
@RequestMapping("/file")
public class FileController {
    public static final String downLoadUrl = "https://www.baidu.com/img/baidu_jgylogo3.gif";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/downLoadFromUrl")
    public String downLoadFromUrl() throws IOException {
        ResponseEntity<byte[]> responseEntity = restTemplate.getForEntity(downLoadUrl, byte[].class, "");
        byte[] bytes = responseEntity.getBody();
//        InputStream inputStream = new ByteArrayInputStream(bytes);
        InputStream inputStream = new URL(downLoadUrl).openStream();
        FileUtils.copyToFile(inputStream, new File("D://tc.jpg"));
        return "success";
    }
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值