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();
static MultipartFormData md
按说Request对象是该次请求的对象,但是如果声明为static的话,那么并发之下,
if(null==md){ 这个if就很迷糊了。
所以是不是多写了一个static声明啊?