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声明啊?