java如何从https下载链接中下载文件
文章目录
从https 下载文件会存在什么用的问题?
普通的http下载非常的简单,无需做任何处理,可以直接用 URL.openStream获取或者restTempate 请求获取。
而https 涉及到证书的问题,(有些网站的https的证书已经在jdk中的信任行列也可以直接下载)jdk没有将证书导入信任行列会报如下异常:
找不到那样的下载链接无法模拟,后面遇到在补.....
导入安全证书到jdk
- 首先下载该链接的安全证书。如何下载安全证书?点击浏览器左上角https旁边的按钮,点击“证书(有效)” 点击上方tab栏的详细信息 -> 点击下方复制到文件 如何就一直下一步直到保存到你的磁盘上。
- 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 接收传输流需要注意的一些问题
- 使用 byte[] 作为 responseType
- 参数中 Object… uriVariables 这些参数是作为链接上的参数,如下面的,k1=v1,k2=v2:
http://localhost:8080/file/downLoadFromUrl?k1=v1&k2=v2
- 如果是body里面的传参,可以使用如下形式:
这里需要注意的是 multiValueMap 的put方法value是一个list,如果是添加单个值要用add方法,详情见MultiValueMap源码
MultiValueMap multiValueMap = new LinkedMultiValueMap();
multiValueMap.add("k","v");
ResponseEntity<byte[]> responseEntity = restTemplate.postForEntity(downLoadUrl,multiValueMap,byte[].class,"");
- 接收到的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";
}
}