BaseController 添加getParamsJson 自动转换请求参数

BaseController 添加getParamsJson 自动转换请求参数为json对象

private MultipartFormData md=null;
/**
 * 处理multipart数据
 * 如果是multipart/form-data类型数据,则需要特殊解析,因为multipart/form-data的数据是以二进制方式上传,而不是key-value形式
 * multipart/form-data 流数据只能被解析一次,要在这里记录
 */
private void initMultipartRequest(){
	if(null==md){
		HttpServletRequest req=getRequest();
		md=ServletUtil.getMultipart(req);
	}
}
/**
 * 获取json格式参数对象
 * @return
 */
public JSONObject getParamsJson(){
	JSONObject paramsJson=new JSONObject();
	if(isApplicationJson()){
		paramsJson=JSON.parseObject(StringUtil.isNotEmpty(getRawData())?getRawData():"{}"); 
	}else if(isMultipartFormData()){
		paramsJson=multipartFormDataToJson();
	}else{
		paramsJson=JSON.parseObject(StrKit.notNull(getKv())?getKv().toJson():"{}");
	}
	return paramsJson;
}

/**
 * 判断是否是application/json请求
 * @return
 */
private boolean isApplicationJson(){
	HttpServletRequest request = getRequest();
	if(StrKit.notNull(request.getContentType()) && (StrKit.equals(request.getContentType(), "application/json") || StrKit.equals(request.getContentType(), "text/json") || request.getContentType().indexOf("application/json")!=-1)){
		return true;
	}else{
		return false;
	}
}
/**
 * 判断是否是multipart/form-data 请求
 * @return
 */
private boolean isMultipartFormData(){
	HttpServletRequest request = getRequest();
	if (StrKit.notNull(request.getContentType()) && request.getContentType().startsWith("multipart/form-data")){
		return true;
	}else{
		return false;
	}
}

/**
 * 将 multipartFormData 数据转为json
 * @return
 */
private JSONObject multipartFormDataToJson(){
	initMultipartRequest();
	JSONObject json=new JSONObject();
	Map<String, String[]> pm=md.getParamMap();
	for (Map.Entry<String, String[]> m : pm.entrySet()) {
        String name = m.getKey();
        String value = m.getValue()[0];
        json.put(name, value);
    }
    return json;
}

/**
 * 保存文件,必须是multipartFormData数据类型请求才能调用此方法
 * @param fileParamName 文件参数名
 * @param savePath 保存路径
 * @return
 */
public boolean saveFileFromRequest(String fileParamName,String savePath){
	return saveFileFromRequest(fileParamName,savePath,false);
}
/**
 * 保存文件,必须是multipartFormData数据类型请求才能调用此方法
 * @param fileParamName 文件参数名
 * @param savePath 保存路径
 * @param addTimestamp 是否添加时间戳
 * @return
 */
@SuppressWarnings("resource")
public boolean saveFileFromRequest(String fileParamName,String savePath,boolean addTimestamp){
	initMultipartRequest();
	boolean rs=true;
	try {
		UploadFile uf=md.getFile(fileParamName);
		if(null!=uf){
			InputStream inputStream=uf.getFileInputStream();
			String _savepath="";
			if(addTimestamp){
				String oldName=uf.getFileName();
				String extension = oldName.substring(oldName.lastIndexOf("."));
				//重命名文件
				String newName=oldName+"_"+DateKit.toStr(new Date(), "YYYYMMddhhmmss")+extension;
				_savepath=savePath+"/"+newName;
			}else{
				_savepath=savePath+"/"+uf.getFileName();
			}
			File file = new File(_savepath);
			FileOutputStream outputStream = new FileOutputStream(file);
		    int read;
		    byte[] bytes = new byte[1024];
		    while ((read = inputStream.read(bytes)) != -1) {
		        outputStream.write(bytes, 0, read);
		    }
		    outputStream.close();
		}else{
			System.out.println("指定参数文件不存在---");
		}
	} catch (FileNotFoundException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
		rs=false;
	} catch (IOException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
		rs=false;
	}
	return rs;
}
/**
 * 前端上传文件时,将文件转为base64编码字符串
 * @param fileParamName
 * @return
 */
public String streamToBase64(String fileParamName){
	initMultipartRequest();
	String encoded=null;
	try {
		UploadFile uf=md.getFile(fileParamName);
		if(null!=uf){
			InputStream inputStream=uf.getFileInputStream();
			byte[] bytes = IOUtils.toByteArray(inputStream);
			encoded = Base64.getEncoder().encodeToString(bytes);
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	return encoded;
}

注:multipart 数据转换用的是hutool的ServletUtil工具

在controller中 这样调用即可:

JSONObject params = getParamsJson();


评论区

杜福忠

2022-03-23 20:35

很赞,用起来应该很方便。有个地方没看懂,就是那个
static MultipartFormData md
按说Request对象是该次请求的对象,但是如果声明为static的话,那么并发之下,
if(null==md){ 这个if就很迷糊了。
所以是不是多写了一个static声明啊?

云破月

2022-03-24 10:13

@杜福忠 确实有并发问题,已把static关键字去掉,一开始是没有md这个全局变量的,后来同时处理文件一起,才这么写,但是multipart用得很少,代码写完就完了,没人发现这个问题……现在把处理文件相关的代码一起放上来了,杜总看看还有啥问题

热门分享

扫码入社