change multipart

This commit is contained in:
Looly 2020-04-10 17:56:10 +08:00
parent a967dd6c79
commit 47be0f4f79
4 changed files with 80 additions and 40 deletions

View File

@ -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;
/**
* 构造

View File

@ -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);
}
/**

View File

@ -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()));
}
}

View File

@ -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());