背景:将上传的文件,如图片,写入指定服务器路径,保存起来。多文件上传时,由于HttpServletRequest不能直接取出文件数据,所以将其强制转换为MultipartHttpServletRequest。本文使用Postman模拟表单提交。
1 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; 2 Map<String,MultipartFile> files = multipartRequest.getFileMap();
后台实现:
/** * @Title uploadFiles * @Description 测试多文件上传 * @date 2018-11-10 10:15 */ @PostMapping("/uploadFiles") public Map<String, Object> uploadFiles(HttpServletRequest req) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req; // 无须知道上传时文件对应的key,遍历处理 Map<String, MultipartFile> files = multipartRequest.getFileMap(); String otherParam = req.getParameter("otherParam"); Map<String, Object> data = new HashMap<>(); for (MultipartFile value : files.values()) { data = uploadFile(value); int code = (int) data.get("code"); if (200 != code) { return data; } } data.put("code", 200); data.put("result", otherParam); return data; } /** * @Title uploadFile * @Description 逐个上传 * @date 2018-11-10 10:17 */ private Map<String, Object> uploadFile(MultipartFile file) { Map<String, Object> result = new HashMap<>(); // 判断文件是否为空 if (file.isEmpty()) { result.put("code", -1); return result; } String fileName = file.getOriginalFilename(); // 原文件名前加时间戳和随机数,避免覆盖文件 String path = "D:/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); path = path + ((int) Math.random() * 999) + "_" + fileName; File dest = new File(path); if (dest.exists()) { result.put("code", -2); return result; } // 判断文件父目录是否存在 if (!dest.getParentFile().exists()) { dest.getParentFile().mkdir(); } try { file.transferTo(dest); // 保存文件 } catch (IOException e) { result.put("code", -3); return result; } result.put("code", 200); return result; }
Postman模拟提交时,配置如图:
环境:springBootVersion 版本 '1.5.3.RELEASE'。