项目目的:
使用MultipartFile接收http post传进来的图片,Controller中把接收到的图像转换为File对象给后续程序使用。
代码实现:
SpringBoot MVC接收外部传入的图片,强转失败。代码如下:
@PostMapping("/parseImage") public String parseImage(HttpServletRequest request, @RequestParam MultipartFile[] uploadFiles) throws IOException, ServletException { StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request; int fileSize = uploadFiles.length; File[] files = new File[fileSize]; for (int i = 0; i < fileSize; i++) { CommonsMultipartFile f = (CommonsMultipartFile) uploadFiles[i]; DiskFileItem dfi = (DiskFileItem) f.getFileItem(); File tempFile = dfi.getStoreLocation(); files[i] = tempFile; } // 此处省略部分代码 // ... return "success"; }
报错:
java.lang.ClassCastException: org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to org.springframework.web.multipart.commons.CommonsMultipartFile
细节说明:
SprintBoot 缺省 HttpServletRequest 的实现是 StandardMultipartHttpServletRequest。
报错其实说的也是很明白了,StandardMultipartFile类不能强转为CommonsMultipartFile,但又想转存为File对象。 基本思路是: 先创建一个新的临时文件dfile对象,然后调用MultipartFile.transferTo(File dfile)方法把MultipartFile转换为File对象。 新的代码如下:
@PostMapping("/parseImage") public String parseImage(HttpServletRequest request, @RequestParam(value = "uploadFiles", required = true) MultipartFile[] uploadFiles) { int fileSize = uploadFiles.length; File[] files = new File[fileSize]; if (uploadFiles != null && uploadFiles.length > 0) { for (int i = 0; i < uploadFiles.length; i++) { MultipartFile f = uploadFiles[i]; System.out.println(f.getName()); // 为上传的key值 System.out.println(f.getOriginalFilename()); // 上传的真实文件的文件名 File dfile = null; try { dfile = File.createTempFile("prefix", "_" + f.getOriginalFilename()); f.transferTo(dfile); files[i] = dfile; } catch (IOException e) { e.printStackTrace(); } } }// 此处忽略部分代码 return "seccess"; }
SpringBoot application.yml配置事例:
spring: servlet: multipart: max-file-size: 20MB max-request-size: 100MB enabled: true resolve-lazily: false