Browse Source

change multipart

Looly 5 years ago
parent
commit
47be0f4f79

+ 1 - 1
hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java

@@ -24,7 +24,7 @@ public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, S
 	/** 默认初始大小 */
 	protected static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
 
-	private Map<K, V> raw;
+	private final Map<K, V> raw;
 
 	/**
 	 * 构造

+ 61 - 30
hutool-core/src/main/java/cn/hutool/core/net/multipart/MultipartFormData.java

@@ -1,13 +1,14 @@
 package cn.hutool.core.net.multipart;
 
-import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.map.multi.ListValueMap;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -20,14 +21,14 @@ import java.util.Set;
 public class MultipartFormData {
 
 	/** 请求参数 */
-	private Map<String, String[]> requestParameters = new HashMap<>();
+	private final ListValueMap<String, String> requestParameters = new ListValueMap<>();
 	/** 请求文件 */
-	private Map<String, UploadFile[]> requestFiles = new HashMap<>();
+	private final ListValueMap<String, UploadFile> requestFiles = new ListValueMap<>();
+	/** 上传选项 */
+	private final UploadSetting setting;
 
 	/** 是否解析完毕 */
 	private boolean loaded;
-	/** 上传选项 */
-	private UploadSetting setting;
 
 	// --------------------------------------------------------------------- Constructor start
 	/**
@@ -104,12 +105,9 @@ public class MultipartFormData {
 	 * @return null未找到,否则返回值
 	 */
 	public String getParam(String paramName) {
-		if (requestParameters == null) {
-			return null;
-		}
-		String[] values = requestParameters.get(paramName);
-		if (ArrayUtil.isNotEmpty(values)) {
-			return values[0];
+		final List<String> values = getListParam(paramName);
+		if (CollUtil.isNotEmpty(values)) {
+			return values.get(0);
 		}
 		return null;
 	}
@@ -118,9 +116,6 @@ public class MultipartFormData {
 	 * @return 获得参数名集合
 	 */
 	public Set<String> getParamNames() {
-		if (requestParameters == null) {
-			return Collections.emptySet();
-		}
 		return requestParameters.keySet();
 	}
 
@@ -131,9 +126,21 @@ public class MultipartFormData {
 	 * @return 数组表单值
 	 */
 	public String[] getArrayParam(String paramName) {
-		if (requestParameters == null) {
-			return null;
+		final List<String> listParam = getListParam(paramName);
+		if(null != listParam){
+			return listParam.toArray(new String[0]);
 		}
+		return null;
+	}
+
+	/**
+	 * 获得集合表单值
+	 *
+	 * @param paramName 参数名
+	 * @return 数组表单值
+	 * @since 5.3.0
+	 */
+	public List<String> getListParam(String paramName) {
 		return requestParameters.get(paramName);
 	}
 
@@ -143,7 +150,16 @@ public class MultipartFormData {
 	 * @return 所有属性的集合
 	 */
 	public Map<String, String[]> getParamMap() {
-		return requestParameters;
+		return Convert.toMap(String.class, String[].class, getParamListMap());
+	}
+
+	/**
+	 * 获取所有属性的集合
+	 *
+	 * @return 所有属性的集合
+	 */
+	public ListValueMap<String, String> getParamListMap() {
+		return this.requestParameters;
 	}
 
 	// --------------------------------------------------------------------------- Files parameters
@@ -169,9 +185,22 @@ public class MultipartFormData {
 	 * @return 上传的文件列表
 	 */
 	public UploadFile[] getFiles(String paramName) {
-		if (requestFiles == null) {
-			return null;
+		final List<UploadFile> fileList = getFileList(paramName);
+		if(null != fileList){
+			return fileList.toArray(new UploadFile[0]);
 		}
+		return null;
+	}
+
+	/**
+	 * 获得某个属性名的所有文件<br>
+	 * 当表单中两个文件使用同一个name的时候
+	 *
+	 * @param paramName 属性名
+	 * @return 上传的文件列表
+	 * @since 5.3.0
+	 */
+	public List<UploadFile> getFileList(String paramName) {
 		return requestFiles.get(paramName);
 	}
 
@@ -181,9 +210,6 @@ public class MultipartFormData {
 	 * @return 上传的文件属性名集合
 	 */
 	public Set<String> getFileParamNames() {
-		if (requestFiles == null) {
-			return Collections.emptySet();
-		}
 		return requestFiles.keySet();
 	}
 
@@ -193,6 +219,15 @@ public class MultipartFormData {
 	 * @return 文件映射
 	 */
 	public Map<String, UploadFile[]> getFileMap() {
+		return Convert.toMap(String.class, UploadFile[].class, getFileListValueMap());
+	}
+
+	/**
+	 * 获取文件映射
+	 *
+	 * @return 文件映射
+	 */
+	public ListValueMap<String, UploadFile> getFileListValueMap() {
 		return this.requestFiles;
 	}
 
@@ -214,9 +249,7 @@ public class MultipartFormData {
 	 * @param uploadFile 文件
 	 */
 	private void putFile(String name, UploadFile uploadFile) {
-		UploadFile[] fileUploads = requestFiles.get(name);
-		fileUploads = fileUploads == null ? new UploadFile[] { uploadFile } : ArrayUtil.append(fileUploads, uploadFile);
-		requestFiles.put(name, fileUploads);
+		this.requestFiles.putValue(name, uploadFile);
 	}
 
 	/**
@@ -226,9 +259,7 @@ public class MultipartFormData {
 	 * @param value 参数值
 	 */
 	private void putParameter(String name, String value) {
-		String[] params = requestParameters.get(name);
-		params = params == null ? new String[] { value } : ArrayUtil.append(params, value);
-		requestParameters.put(name, params);
+		this.requestParameters.putValue(name, value);
 	}
 
 	/**

+ 1 - 1
hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java

@@ -260,7 +260,7 @@ public class UploadFile {
 	 * @throws IOException IO异常
 	 */
 	private void assertValid() throws IOException {
-		if (!isUploaded()) {
+		if (false == isUploaded()) {
 			throw new IOException(StrUtil.format("File [{}] upload fail", getFileName()));
 		}
 	}

+ 17 - 8
hutool-http/src/main/java/cn/hutool/http/server/HttpServerRequest.java

@@ -38,6 +38,7 @@ public class HttpServerRequest extends HttpServerBase {
 
 	private Map<String, HttpCookie> cookieCache;
 	private ListValueMap<String, String> paramsCache;
+	private MultipartFormData multipartFormDataCache;
 	private Charset charsetCache;
 	private byte[] bodyCache;
 
@@ -154,7 +155,7 @@ public class HttpServerRequest extends HttpServerBase {
 	 * @return Content-Type头信息
 	 */
 	public String getContentType() {
-		return getHeader(Header.USER_AGENT);
+		return getHeader(Header.CONTENT_TYPE);
 	}
 
 	/**
@@ -306,10 +307,15 @@ public class HttpServerRequest extends HttpServerBase {
 				this.paramsCache.putAll(HttpUtil.decodeParams(query, charset));
 			}
 
-			// 解析body中的参数
-			final String body = getBody();
-			if(StrUtil.isNotBlank(body)){
-				this.paramsCache.putAll(HttpUtil.decodeParams(body, charset));
+			// 解析multipart中的参数
+			if(isMultipart()){
+				this.paramsCache.putAll(getMultipart().getParamListMap());
+			} else{
+				// 解析body中的参数
+				final String body = getBody();
+				if(StrUtil.isNotBlank(body)){
+					this.paramsCache.putAll(HttpUtil.decodeParams(body, charset));
+				}
 			}
 		}
 
@@ -372,14 +378,17 @@ public class HttpServerRequest extends HttpServerBase {
 	}
 
 	/**
-	 * 获得MultiPart表单内容,多用于获得上传的文件 在同一次请求中,此方法只能被执行一次!
+	 * 获得MultiPart表单内容,多用于获得上传的文件
 	 *
 	 * @return MultipartFormData
 	 * @throws IORuntimeException IO异常
 	 * @since 5.3.0
 	 */
 	public MultipartFormData getMultipart() throws IORuntimeException {
-		return getMultipart(new UploadSetting());
+		if(null == this.multipartFormDataCache){
+			this.multipartFormDataCache = parseMultipart(new UploadSetting());
+		}
+		return this.multipartFormDataCache;
 	}
 
 	/**
@@ -392,7 +401,7 @@ public class HttpServerRequest extends HttpServerBase {
 	 * @throws IORuntimeException IO异常
 	 * @since 5.3.0
 	 */
-	public MultipartFormData getMultipart(UploadSetting uploadSetting) throws IORuntimeException {
+	public MultipartFormData parseMultipart(UploadSetting uploadSetting) throws IORuntimeException {
 		final MultipartFormData formData = new MultipartFormData(uploadSetting);
 		try {
 			formData.parseRequestStream(getBodyStream(), getCharset());