JFinal使用技巧-HttpKit支持文件上传

HttpKit支持文件上传 , 标题党一下, 这里分享一下我包装的工具类,直接上石马~

  1. package com.momathink.update.kit;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.Closeable;
  5. import java.io.DataInputStream;
  6. import java.io.DataOutputStream;
  7. import java.io.File;
  8. import java.io.FileInputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.io.InputStreamReader;
  12. import java.io.OutputStream;
  13. import java.net.HttpURLConnection;
  14. import java.net.URL;
  15. import java.nio.charset.Charset;
  16. import java.security.SecureRandom;
  17. import java.security.cert.CertificateException;
  18. import java.security.cert.X509Certificate;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21.  
  22. import javax.net.ssl.HostnameVerifier;
  23. import javax.net.ssl.HttpsURLConnection;
  24. import javax.net.ssl.SSLContext;
  25. import javax.net.ssl.SSLSession;
  26. import javax.net.ssl.TrustManager;
  27. import javax.net.ssl.X509TrustManager;
  28.  
  29. import com.jfinal.kit.HttpKit;
  30. import com.jfinal.kit.JsonKit;
  31.  
  32. public class UpdateHttp {
  33. private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36";
  34.  
  35. /**
  36.  * 上传代码来自 jfinal-weixin
  37.  * 
  38.  * @param url  上传网址
  39.  * @param file 上传的文件
  40.  * @return ApiResult
  41.  * @throws IOException
  42.  */
  43. public static String uploadFile(String url, File file) throws IOException {
  44. URL urlGet = new URL(url);
  45. HttpURLConnection conn = (HttpURLConnection) urlGet.openConnection();
  46. if (conn instanceof HttpsURLConnection) {
  47. conn = newHttpsURLConnection(conn);
  48. }
  49. conn.setDoOutput(true);
  50. conn.setDoInput(true);
  51. conn.setUseCaches(false);
  52. conn.setRequestMethod("POST");
  53. conn.setRequestProperty("connection", "Keep-Alive");
  54. conn.setRequestProperty("user-agent", DEFAULT_USER_AGENT);
  55. //conn.setRequestProperty("Charsert", "UTF-8");
  56. conn.setRequestProperty("Accept-Charset", "UTF-8");
  57. // 定义数据分隔线
  58. String BOUNDARY = "----WebKitFormBoundaryiDGnV9zdZA1eM1yL";
  59. conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
  60.  
  61. OutputStream out = new DataOutputStream(conn.getOutputStream());
  62. // 定义最后数据分隔线
  63. StringBuilder mediaData = new StringBuilder();
  64. mediaData.append("--").append(BOUNDARY).append("\r\n");
  65. mediaData.append("Content-Disposition: form-data;name=\"media\";filename=\"" + file.getName() + "\"\r\n");
  66. mediaData.append("Content-Type:application/octet-stream\r\n\r\n");
  67. byte[] mediaDatas = mediaData.toString().getBytes();
  68. out.write(mediaDatas);
  69. DataInputStream fs = new DataInputStream(new FileInputStream(file));
  70. int bytes = 0;
  71. byte[] bufferOut = new byte[1024];
  72. while ((bytes = fs.read(bufferOut)) != -1) {
  73. out.write(bufferOut, 0, bytes);
  74. }
  75. closeQuietly(fs);
  76. // 多个文件时,二个文件之间加入这个
  77. //out.write("\r\n".getBytes());
  78.  
  79. byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
  80. out.write(end_data);
  81. out.flush();
  82. closeQuietly(out);
  83.  
  84. // 定义BufferedReader输入流来读取URL的响应
  85. InputStream in = conn.getInputStream();
  86. BufferedReader read = new BufferedReader(new InputStreamReader(in, Charset.forName("UTF-8")));
  87. String valueString = null;
  88. StringBuffer bufferRes = null;
  89. bufferRes = new StringBuffer();
  90. while ((valueString = read.readLine()) != null) {
  91. bufferRes.append(valueString);
  92. }
  93. read.close();
  94. closeQuietly(in);
  95. // 关闭连接
  96. if (conn != null) {
  97. conn.disconnect();
  98. }
  99. return bufferRes.toString();
  100. }
  101.  
  102. protected static HttpsURLConnection newHttpsURLConnection(HttpURLConnection cn) {
  103. try {
  104. HttpsURLConnection conn = (HttpsURLConnection) cn;
  105.  
  106. SSLContext sc = SSLContext.getInstance("SSL");
  107. sc.init(null, new TrustManager[] { new X509TrustManager() {
  108.  
  109. @Override
  110. public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
  111. }
  112.  
  113. @Override
  114. public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
  115. }
  116.  
  117. @Override
  118. public X509Certificate[] getAcceptedIssuers() {
  119. return new X509Certificate[] {};
  120. }
  121.  
  122. } }, new SecureRandom());
  123.  
  124. conn.setSSLSocketFactory(sc.getSocketFactory());
  125. conn.setHostnameVerifier(new HostnameVerifier() {
  126.  
  127. @Override
  128. public boolean verify(String hostname, SSLSession session) {
  129. return true;
  130. }
  131. });
  132. return conn;
  133. } catch (Exception e) {
  134. e.printStackTrace();
  135. return null;
  136. }
  137. }
  138.  
  139. public static void closeQuietly(Closeable closeable) {
  140. try {
  141. if (closeable != null) {
  142. closeable.close();
  143. }
  144. } catch (IOException ioe) {
  145. // ignore
  146. }
  147. }
  148.  
  149. public static String get(String url) {
  150. return HttpKit.get(url);
  151. }
  152.  
  153. public static String post(String url, Object data) {
  154. Map<String, String> headers = new HashMap<>();
  155. headers.put("Content-Type", "application/json");
  156. return HttpKit.post(url, JsonKit.toJson(data), headers);
  157. }
  158. }

类名字自己起吧, 可以叫  MyHttpKit之类的,自己改下
使用简单:

  1. String uploadFile(String url, File file)
  2. String get(String url)
  3. String post(String url, Object data)  《是JSON提交的

进来了就点个赞吧2333

评论区

JFinal

2020-07-17 16:07

简洁大方,赞

fmpoffice

2021-03-19 16:28

有一个小小问题,md5校验失败,发现是自动在文件多了一个回车:https://jfinal.com/share/2383

杜福忠

2021-03-19 22:02

@fmpoffice 好勒我还没有试过用MD5校验,等下试试,读代码感觉是符合HTTP协议格式的,我再细研究一下

杜福忠

2021-03-20 11:17

@fmpoffice 多了//out.write("\r\n".getBytes());已经注释,感谢老铁反馈

chcode

2023-04-05 19:06

@杜福忠 Charsert是否拼写错误?

杜福忠

2023-04-06 00:19

@chcode 按协议是Accept-Charset,上面怀疑是拷贝的错误,怕错的多了,行业兼容了吧。。。要么就是这个错误键是无用值,服务器默认就是UTF-8,所以一直也没问题,回头测试一下改其他值

热门分享

扫码入社