From 47be0f4f79b68cf1d913b0682466f8a28a02d9ac Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Apr 2020 17:56:10 +0800 Subject: [PATCH] change multipart --- .../java/cn/hutool/core/map/MapWrapper.java | 2 +- .../core/net/multipart/MultipartFormData.java | 91 +++++++++++++------ .../hutool/core/net/multipart/UploadFile.java | 2 +- .../hutool/http/server/HttpServerRequest.java | 25 +++-- 4 files changed, 80 insertions(+), 40 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java index 79cdd94f4..7da37c9a7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java @@ -24,7 +24,7 @@ public class MapWrapper implements Map, Iterable>, S /** 默认初始大小 */ protected static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 - private Map raw; + private final Map raw; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/multipart/MultipartFormData.java b/hutool-core/src/main/java/cn/hutool/core/net/multipart/MultipartFormData.java index 45f003980..b6162dc98 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/multipart/MultipartFormData.java +++ b/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 requestParameters = new HashMap<>(); + private final ListValueMap requestParameters = new ListValueMap<>(); /** 请求文件 */ - private Map requestFiles = new HashMap<>(); + private final ListValueMap 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 values = getListParam(paramName); + if (CollUtil.isNotEmpty(values)) { + return values.get(0); } return null; } @@ -118,9 +116,6 @@ public class MultipartFormData { * @return 获得参数名集合 */ public Set 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 listParam = getListParam(paramName); + if(null != listParam){ + return listParam.toArray(new String[0]); } + return null; + } + + /** + * 获得集合表单值 + * + * @param paramName 参数名 + * @return 数组表单值 + * @since 5.3.0 + */ + public List getListParam(String paramName) { return requestParameters.get(paramName); } @@ -143,7 +150,16 @@ public class MultipartFormData { * @return 所有属性的集合 */ public Map getParamMap() { - return requestParameters; + return Convert.toMap(String.class, String[].class, getParamListMap()); + } + + /** + * 获取所有属性的集合 + * + * @return 所有属性的集合 + */ + public ListValueMap 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 fileList = getFileList(paramName); + if(null != fileList){ + return fileList.toArray(new UploadFile[0]); } + return null; + } + + /** + * 获得某个属性名的所有文件
+ * 当表单中两个文件使用同一个name的时候 + * + * @param paramName 属性名 + * @return 上传的文件列表 + * @since 5.3.0 + */ + public List getFileList(String paramName) { return requestFiles.get(paramName); } @@ -181,9 +210,6 @@ public class MultipartFormData { * @return 上传的文件属性名集合 */ public Set getFileParamNames() { - if (requestFiles == null) { - return Collections.emptySet(); - } return requestFiles.keySet(); } @@ -193,6 +219,15 @@ public class MultipartFormData { * @return 文件映射 */ public Map getFileMap() { + return Convert.toMap(String.class, UploadFile[].class, getFileListValueMap()); + } + + /** + * 获取文件映射 + * + * @return 文件映射 + */ + public ListValueMap 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); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java b/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java index bf0b548fd..4cc456934 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/multipart/UploadFile.java +++ b/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())); } } diff --git a/hutool-http/src/main/java/cn/hutool/http/server/HttpServerRequest.java b/hutool-http/src/main/java/cn/hutool/http/server/HttpServerRequest.java index f7b14d5fd..d62c96b67 100644 --- a/hutool-http/src/main/java/cn/hutool/http/server/HttpServerRequest.java +++ b/hutool-http/src/main/java/cn/hutool/http/server/HttpServerRequest.java @@ -38,6 +38,7 @@ public class HttpServerRequest extends HttpServerBase { private Map cookieCache; private ListValueMap 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());