mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-08 22:58:05 +08:00
change multipart
This commit is contained in:
parent
a967dd6c79
commit
47be0f4f79
@ -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
|
protected static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
|
||||||
|
|
||||||
private Map<K, V> raw;
|
private final Map<K, V> raw;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造
|
* 构造
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
package cn.hutool.core.net.multipart;
|
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.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Collections;
|
import java.util.List;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@ -20,14 +21,14 @@ import java.util.Set;
|
|||||||
public class MultipartFormData {
|
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 boolean loaded;
|
||||||
/** 上传选项 */
|
|
||||||
private UploadSetting setting;
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------- Constructor start
|
// --------------------------------------------------------------------- Constructor start
|
||||||
/**
|
/**
|
||||||
@ -104,12 +105,9 @@ public class MultipartFormData {
|
|||||||
* @return null未找到,否则返回值
|
* @return null未找到,否则返回值
|
||||||
*/
|
*/
|
||||||
public String getParam(String paramName) {
|
public String getParam(String paramName) {
|
||||||
if (requestParameters == null) {
|
final List<String> values = getListParam(paramName);
|
||||||
return null;
|
if (CollUtil.isNotEmpty(values)) {
|
||||||
}
|
return values.get(0);
|
||||||
String[] values = requestParameters.get(paramName);
|
|
||||||
if (ArrayUtil.isNotEmpty(values)) {
|
|
||||||
return values[0];
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -118,9 +116,6 @@ public class MultipartFormData {
|
|||||||
* @return 获得参数名集合
|
* @return 获得参数名集合
|
||||||
*/
|
*/
|
||||||
public Set<String> getParamNames() {
|
public Set<String> getParamNames() {
|
||||||
if (requestParameters == null) {
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
return requestParameters.keySet();
|
return requestParameters.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,9 +126,21 @@ public class MultipartFormData {
|
|||||||
* @return 数组表单值
|
* @return 数组表单值
|
||||||
*/
|
*/
|
||||||
public String[] getArrayParam(String paramName) {
|
public String[] getArrayParam(String paramName) {
|
||||||
if (requestParameters == null) {
|
final List<String> listParam = getListParam(paramName);
|
||||||
|
if(null != listParam){
|
||||||
|
return listParam.toArray(new String[0]);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得集合表单值
|
||||||
|
*
|
||||||
|
* @param paramName 参数名
|
||||||
|
* @return 数组表单值
|
||||||
|
* @since 5.3.0
|
||||||
|
*/
|
||||||
|
public List<String> getListParam(String paramName) {
|
||||||
return requestParameters.get(paramName);
|
return requestParameters.get(paramName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +150,16 @@ public class MultipartFormData {
|
|||||||
* @return 所有属性的集合
|
* @return 所有属性的集合
|
||||||
*/
|
*/
|
||||||
public Map<String, String[]> getParamMap() {
|
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
|
// --------------------------------------------------------------------------- Files parameters
|
||||||
@ -169,9 +185,22 @@ public class MultipartFormData {
|
|||||||
* @return 上传的文件列表
|
* @return 上传的文件列表
|
||||||
*/
|
*/
|
||||||
public UploadFile[] getFiles(String paramName) {
|
public UploadFile[] getFiles(String paramName) {
|
||||||
if (requestFiles == null) {
|
final List<UploadFile> fileList = getFileList(paramName);
|
||||||
|
if(null != fileList){
|
||||||
|
return fileList.toArray(new UploadFile[0]);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得某个属性名的所有文件<br>
|
||||||
|
* 当表单中两个文件使用同一个name的时候
|
||||||
|
*
|
||||||
|
* @param paramName 属性名
|
||||||
|
* @return 上传的文件列表
|
||||||
|
* @since 5.3.0
|
||||||
|
*/
|
||||||
|
public List<UploadFile> getFileList(String paramName) {
|
||||||
return requestFiles.get(paramName);
|
return requestFiles.get(paramName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,9 +210,6 @@ public class MultipartFormData {
|
|||||||
* @return 上传的文件属性名集合
|
* @return 上传的文件属性名集合
|
||||||
*/
|
*/
|
||||||
public Set<String> getFileParamNames() {
|
public Set<String> getFileParamNames() {
|
||||||
if (requestFiles == null) {
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
return requestFiles.keySet();
|
return requestFiles.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +219,15 @@ public class MultipartFormData {
|
|||||||
* @return 文件映射
|
* @return 文件映射
|
||||||
*/
|
*/
|
||||||
public Map<String, UploadFile[]> getFileMap() {
|
public Map<String, UploadFile[]> getFileMap() {
|
||||||
|
return Convert.toMap(String.class, UploadFile[].class, getFileListValueMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件映射
|
||||||
|
*
|
||||||
|
* @return 文件映射
|
||||||
|
*/
|
||||||
|
public ListValueMap<String, UploadFile> getFileListValueMap() {
|
||||||
return this.requestFiles;
|
return this.requestFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,9 +249,7 @@ public class MultipartFormData {
|
|||||||
* @param uploadFile 文件
|
* @param uploadFile 文件
|
||||||
*/
|
*/
|
||||||
private void putFile(String name, UploadFile uploadFile) {
|
private void putFile(String name, UploadFile uploadFile) {
|
||||||
UploadFile[] fileUploads = requestFiles.get(name);
|
this.requestFiles.putValue(name, uploadFile);
|
||||||
fileUploads = fileUploads == null ? new UploadFile[] { uploadFile } : ArrayUtil.append(fileUploads, uploadFile);
|
|
||||||
requestFiles.put(name, fileUploads);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -226,9 +259,7 @@ public class MultipartFormData {
|
|||||||
* @param value 参数值
|
* @param value 参数值
|
||||||
*/
|
*/
|
||||||
private void putParameter(String name, String value) {
|
private void putParameter(String name, String value) {
|
||||||
String[] params = requestParameters.get(name);
|
this.requestParameters.putValue(name, value);
|
||||||
params = params == null ? new String[] { value } : ArrayUtil.append(params, value);
|
|
||||||
requestParameters.put(name, params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -260,7 +260,7 @@ public class UploadFile {
|
|||||||
* @throws IOException IO异常
|
* @throws IOException IO异常
|
||||||
*/
|
*/
|
||||||
private void assertValid() throws IOException {
|
private void assertValid() throws IOException {
|
||||||
if (!isUploaded()) {
|
if (false == isUploaded()) {
|
||||||
throw new IOException(StrUtil.format("File [{}] upload fail", getFileName()));
|
throw new IOException(StrUtil.format("File [{}] upload fail", getFileName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ public class HttpServerRequest extends HttpServerBase {
|
|||||||
|
|
||||||
private Map<String, HttpCookie> cookieCache;
|
private Map<String, HttpCookie> cookieCache;
|
||||||
private ListValueMap<String, String> paramsCache;
|
private ListValueMap<String, String> paramsCache;
|
||||||
|
private MultipartFormData multipartFormDataCache;
|
||||||
private Charset charsetCache;
|
private Charset charsetCache;
|
||||||
private byte[] bodyCache;
|
private byte[] bodyCache;
|
||||||
|
|
||||||
@ -154,7 +155,7 @@ public class HttpServerRequest extends HttpServerBase {
|
|||||||
* @return Content-Type头信息
|
* @return Content-Type头信息
|
||||||
*/
|
*/
|
||||||
public String getContentType() {
|
public String getContentType() {
|
||||||
return getHeader(Header.USER_AGENT);
|
return getHeader(Header.CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -306,12 +307,17 @@ public class HttpServerRequest extends HttpServerBase {
|
|||||||
this.paramsCache.putAll(HttpUtil.decodeParams(query, charset));
|
this.paramsCache.putAll(HttpUtil.decodeParams(query, charset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 解析multipart中的参数
|
||||||
|
if(isMultipart()){
|
||||||
|
this.paramsCache.putAll(getMultipart().getParamListMap());
|
||||||
|
} else{
|
||||||
// 解析body中的参数
|
// 解析body中的参数
|
||||||
final String body = getBody();
|
final String body = getBody();
|
||||||
if(StrUtil.isNotBlank(body)){
|
if(StrUtil.isNotBlank(body)){
|
||||||
this.paramsCache.putAll(HttpUtil.decodeParams(body, charset));
|
this.paramsCache.putAll(HttpUtil.decodeParams(body, charset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return this.paramsCache;
|
return this.paramsCache;
|
||||||
}
|
}
|
||||||
@ -372,14 +378,17 @@ public class HttpServerRequest extends HttpServerBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得MultiPart表单内容,多用于获得上传的文件 在同一次请求中,此方法只能被执行一次!
|
* 获得MultiPart表单内容,多用于获得上传的文件
|
||||||
*
|
*
|
||||||
* @return MultipartFormData
|
* @return MultipartFormData
|
||||||
* @throws IORuntimeException IO异常
|
* @throws IORuntimeException IO异常
|
||||||
* @since 5.3.0
|
* @since 5.3.0
|
||||||
*/
|
*/
|
||||||
public MultipartFormData getMultipart() throws IORuntimeException {
|
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异常
|
* @throws IORuntimeException IO异常
|
||||||
* @since 5.3.0
|
* @since 5.3.0
|
||||||
*/
|
*/
|
||||||
public MultipartFormData getMultipart(UploadSetting uploadSetting) throws IORuntimeException {
|
public MultipartFormData parseMultipart(UploadSetting uploadSetting) throws IORuntimeException {
|
||||||
final MultipartFormData formData = new MultipartFormData(uploadSetting);
|
final MultipartFormData formData = new MultipartFormData(uploadSetting);
|
||||||
try {
|
try {
|
||||||
formData.parseRequestStream(getBodyStream(), getCharset());
|
formData.parseRequestStream(getBodyStream(), getCharset());
|
||||||
|
Loading…
Reference in New Issue
Block a user