读取URI 链接文件,并 上传 MultipartFile 文件
直接上代码:
下载图片 为二进制 , 并把 二进制图片,转换为 MultipartFile 文件
1 /** 2 * 获取图片二进制 3 * @param url 4 * @return 5 */ 6 public static byte[] downloadPicture(String url) { 7 URL urlConnection = null; 8 HttpURLConnection httpURLConnection = null; 9 try { 10 //该部分必须在获取connection前调用 11 trustAllHttpsCertificates(); 12 HostnameVerifier hv = new HostnameVerifier() { 13 public boolean verify(String urlHostName, SSLSession session) { 14 logger.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); 15 return true; 16 } 17 }; 18 HttpsURLConnection.setDefaultHostnameVerifier(hv); 19 20 urlConnection = new URL(url); 21 httpURLConnection = (HttpURLConnection) urlConnection.openConnection(); 22 InputStream in = httpURLConnection.getInputStream(); 23 byte[] buffer = new byte[1024]; 24 int len = 0; 25 ByteArrayOutputStream out = new ByteArrayOutputStream(); 26 while ((len = in.read(buffer)) != -1) { 27 out.write(buffer, 0, len); 28 } 29 in.close(); 30 out.close(); 31 return out.toByteArray(); 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } finally { 35 httpURLConnection.disconnect(); 36 } 37 return null; 38 } 39 40 /** 41 * 忽略HTTPS访问时证书问题 42 * @throws Exception 43 */ 44 private static void trustAllHttpsCertificates() throws Exception { 45 javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; 46 javax.net.ssl.TrustManager tm = new miTM(); 47 trustAllCerts[0] = tm; 48 javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); 49 sc.init(null, trustAllCerts, null); 50 javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 51 } 52 53 private static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { 54 public java.security.cert.X509Certificate[] getAcceptedIssuers() { 55 return null; 56 } 57 58 public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) { 59 return true; 60 } 61 62 public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) { 63 return true; 64 } 65 66 public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) 67 throws java.security.cert.CertificateException { 68 return; 69 } 70 71 public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) 72 throws java.security.cert.CertificateException { 73 return; 74 } 75 } 76 77 /** 78 * 二进制文件转换MultipartFile 79 * @param name String对象为文件名称 80 * @param bytes MultipartFile 81 * @return 82 */ 83 public static MultipartFile getMultipartFile(String name, byte[] bytes) { 84 MultipartFile mfile = null; 85 ByteArrayInputStream in = null; 86 try { 87 in = new ByteArrayInputStream(bytes); 88 FileItemFactory factory = new DiskFileItemFactory(16, null); 89 FileItem fileItem = factory.createItem("mainFile", "text/plain", false, name); 90 IOUtils.copy(new ByteArrayInputStream(bytes), fileItem.getOutputStream()); 91 mfile = new CommonsMultipartFile(fileItem); 92 in.close(); 93 } catch (Exception e) { 94 e.printStackTrace(); 95 } 96 return mfile; 97 }
上传文件代码:
1 /** 2 * 上传附件 3 * @param url String对象为接口链接 4 * @param file MultipartFile 5 * @return 6 */ 7 public static String requestByPostParts( String url , MultipartFile file) { 8 CloseableHttpClient httpClient = HttpClients.createDefault(); 9 10 BufferedReader br = null; 11 try{ 12 HttpPost post = new HttpPost(url); 13 // post.setHeader("Content-Type", "multipart/form-data");//去掉Header 14 15 MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); 16 multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); // 加上此行代码解决返回中文乱码问题 17 multipartEntityBuilder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, file.getName());// 文件流 18 HttpEntity httpEntity=multipartEntityBuilder.build(); 19 // 设置请求参数 20 post.setEntity(httpEntity); 21 // 发起交易 22 HttpResponse resp = httpClient.execute(post); 23 int ret = resp.getStatusLine().getStatusCode(); 24 // 响应分析 25 HttpEntity entity = resp.getEntity(); 26 br = new BufferedReader(new InputStreamReader(entity.getContent(), Charset.forName("UTF-8"))); 27 StringBuffer responseString = new StringBuffer(); 28 String result = br.readLine(); 29 while (result != null) { 30 responseString.append(result); 31 result = br.readLine(); 32 } 33 return responseString.toString(); 34 } catch (Exception e) { 35 logger.error(e.getMessage(), e); 36 return ""; 37 } finally{ 38 if (br != null) { 39 try { 40 br.close(); 41 } catch (IOException e){ 42 logger.error(e.getMessage(), e); 43 } 44 } 45 } 46 }
总结:
1.在获取文件过程中遇见,ssl 证书问题,无法直接读取文件,解决凡是:1添加证书 在jdk 中;2.直接忽略ssl证书;
2.在上传文件中,一直 "request is not a multipart request",提示信息;找了好多方式,做下记录;
参考:
https://www.codenong.com/cs106937994/