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

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

package com.momathink.update.kit;

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import com.jfinal.kit.HttpKit;
import com.jfinal.kit.JsonKit;

public class UpdateHttp {
	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";

	/**
	 * 上传代码来自 jfinal-weixin
	 * 
	 * @param url  上传网址
	 * @param file 上传的文件
	 * @return ApiResult
	 * @throws IOException
	 */
	public static String uploadFile(String url, File file) throws IOException {
		URL urlGet = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) urlGet.openConnection();
		if (conn instanceof HttpsURLConnection) {
			conn = newHttpsURLConnection(conn);
		}
		conn.setDoOutput(true);
		conn.setDoInput(true);
		conn.setUseCaches(false);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "Keep-Alive");
		conn.setRequestProperty("user-agent", DEFAULT_USER_AGENT);
		conn.setRequestProperty("Charsert", "UTF-8");
		// 定义数据分隔线
		String BOUNDARY = "----WebKitFormBoundaryiDGnV9zdZA1eM1yL";
		conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

		OutputStream out = new DataOutputStream(conn.getOutputStream());
		// 定义最后数据分隔线
		StringBuilder mediaData = new StringBuilder();
		mediaData.append("--").append(BOUNDARY).append("\r\n");
		mediaData.append("Content-Disposition: form-data;name=\"media\";filename=\"" + file.getName() + "\"\r\n");
		mediaData.append("Content-Type:application/octet-stream\r\n\r\n");
		byte[] mediaDatas = mediaData.toString().getBytes();
		out.write(mediaDatas);
		DataInputStream fs = new DataInputStream(new FileInputStream(file));
		int bytes = 0;
		byte[] bufferOut = new byte[1024];
		while ((bytes = fs.read(bufferOut)) != -1) {
			out.write(bufferOut, 0, bytes);
		}
		closeQuietly(fs);
		// 多个文件时,二个文件之间加入这个
		//out.write("\r\n".getBytes());

		byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
		out.write(end_data);
		out.flush();
		closeQuietly(out);

		// 定义BufferedReader输入流来读取URL的响应
		InputStream in = conn.getInputStream();
		BufferedReader read = new BufferedReader(new InputStreamReader(in, Charset.forName("UTF-8")));
		String valueString = null;
		StringBuffer bufferRes = null;
		bufferRes = new StringBuffer();
		while ((valueString = read.readLine()) != null) {
			bufferRes.append(valueString);
		}
		read.close();
		closeQuietly(in);
		// 关闭连接
		if (conn != null) {
			conn.disconnect();
		}
		return bufferRes.toString();
	}

	protected static HttpsURLConnection newHttpsURLConnection(HttpURLConnection cn) {
		try {
			HttpsURLConnection conn = (HttpsURLConnection) cn;

			SSLContext sc = SSLContext.getInstance("SSL");
			sc.init(null, new TrustManager[] { new X509TrustManager() {

				@Override
				public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
				}

				@Override
				public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
				}

				@Override
				public X509Certificate[] getAcceptedIssuers() {
					return new X509Certificate[] {};
				}

			} }, new SecureRandom());

			conn.setSSLSocketFactory(sc.getSocketFactory());
			conn.setHostnameVerifier(new HostnameVerifier() {

				@Override
				public boolean verify(String hostname, SSLSession session) {
					return true;
				}
			});
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public static void closeQuietly(Closeable closeable) {
		try {
			if (closeable != null) {
				closeable.close();
			}
		} catch (IOException ioe) {
			// ignore
		}
	}

	public static String get(String url) {
		return HttpKit.get(url);
	}

	public static String post(String url, Object data) {
		Map<String, String> headers = new HashMap<>();
		headers.put("Content-Type", "application/json");
		return HttpKit.post(url, JsonKit.toJson(data), headers);
	}
}

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

String uploadFile(String url, File file)
String get(String url)
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,所以一直也没问题,回头测试一下改其他值

热门分享

扫码入社