下载网络图片(可忽略证书,下载https图片,海康人脸图片提取)
前言:(22.10.31)最近在做海康ISC对接,其中有一个人员人脸下载到本地并保存,其中遇到https图片下载需要证书问题特此记录
问题:
- 通过海康提取人员图片接口,会返回 重定向请求redirect:picUrl
解决:重定向获取图片完整地址
// 设置平台参数
ArtemisConfig config = new ArtemisConfig();
config.setHost(host);
config.setAppKey(appKey);
config.setAppSecret(appSecret);
// 设置接口的URI地址
Map<String, String> path = new HashMap<>();
path.put(Constants.HTTPS, Constants.ARTEMIS_PATH + url);
// 设置参数提交方式
String contentType = "application/json";
// 请求参数
String body = jsonBody.toJSONString();
String redirectUrl = "";
// 调用接口,返回结果
String httpSchema = (String) path.keySet().toArray()[0];
if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) {
try {
Map<String, String> headers = new HashMap();
headers.put("Accept", "*/*");
headers.put("Content-Type", "application/json");
Request request = new Request(Method.POST_STRING, httpSchema + host, (String) path.get(httpSchema), appKey, appSecret, 60);
request.setHeaders(headers);
request.setStringBody(body);
Response response = Client.execute(request);
redirectUrl = response.getHeader("Location");
} catch (Exception var11) {
// logger.error("the Artemis PostString Request is failed[doPostStringArtemis]", var11);
}
//閲嶅畾鍚戝悗鐨剈rl
return redirectUrl;
} else {
throw new RuntimeException("http鍜宧ttps鍙傛暟閿欒httpSchema: " + httpSchema);
}
请注意返回的地址 是 http://:0 ,没有ip和端口,需要自己替换 将‘http://:0’替换为 "https://" + host
才能访问
- 下载网络图片,并下载到本地,(如果你也是用的若依可以将这段代码直接粘贴到FileUploadUtils,然后调用uploadNetworkImg()方法)
得到地址url后,在本地文件创建一个图片 例如 我的文件储存地址(我们使用的是若依,在服务器也是同样创建一个图片)D:\hnclsy\uploadPath\avatar\copy.jpg
/**
* 下载网络图片,并上传到本地,如果是https 忽略证书直接下载
* @param networkUrl 可访问的网络图片地址
* @param path 创建一个文件对象用来保存图片
* @param fileName 创建一个文件对象用来保存图片文件名
* @return 上传到本地文件 地址
*/
public static final String uploadNetworkImg(String path,String fileName,String networkUrl) throws Exception {
trustAllHosts();
// //解决通讯协议bug
// // 第一步
// String encoder = java.net.URLEncoder(networkUrl, "UTF-8");
// //第二步
// String decoder = java.net.URLDecoder(encoder, "UTF-8");
URL url = new URL(networkUrl);
//打开连接
HttpURLConnection conn = null;
// 通过请求地址判断请求类型(http或者是https)
if (url.getProtocol().toLowerCase().equals("https")) {
HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
https.setHostnameVerifier(DO_NOT_VERIFY);
conn = https;
} else {
conn = (HttpURLConnection) url.openConnection();
}
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为10秒
conn.setConnectTimeout(10 * 1000);
//通过输入流获取图片数据
InputStream is = conn.getInputStream();
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
byte[] data = readInputStream(is);
//创建一个文件对象用来保存图片,默认保存当前工程根目录,起名叫Copy.jpg
File imageFile = new File(path+fileName);
//创建输出流
FileOutputStream outStream = new FileOutputStream(imageFile);
//写入数据
outStream.write(data);
//关闭输出流,释放资源
outStream.close();
FileItem fileItem = getMultipartFile(imageFile, "templFileItem");
//CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
return FileUploadUtils.upload(HnClsyConfig.getAvatarPath(), new CommonsMultipartFile(fileItem));
}
public static void trustAllHosts() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[] {};
}
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
} };
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
/**
* 将file转换成fileItem
* @param file
* @param fieldName
* @return
*/
private static FileItem getMultipartFile(File file, String fieldName){
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem(fieldName, "text/plain", true, file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return item;
}
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[6024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len;
//使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
//关闭输入流
inStream.close();
//把outStream里的数据写入内存
return outStream.toByteArray();
}```