读取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/

posted @ 2023-06-15 14:49  lypsoft  阅读(126)  评论(0编辑  收藏  举报