在controller中,添加对应的方法体:
@PostMapping("/upload")@ResponseBodypublic ApiRestResponse upload(HttpServletRequest httpServletRequest, @RequestParam("file")MultipartFile file) throws IOException {String fileName = file.getOriginalFilename(); // 截取.前面的文件名String suffixName = fileName.substring(fileName.lastIndexOf("."));UUID uuid = UUID.randomUUID();String newFileName = uuid.toString() + suffixName; // 文件目录File fileDirectory = new File(Constant.FILE_UPLOAD_DIR); // 文件名,Constant是我定义的常量类,具体内容在后面 File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);if(!fileDirectory.exists()){if (!fileDirectory.mkdir()) {throw new PlatformException(PlatformExceptionEnum.MAKEIDR_FAILED);}}try { // 需要注意,当你在transferTo这个方法中传入了相对路径,该方法会自动为你拼接上一个默认的路径,会导致虽然保存成功,但是你却找不到该文件file.transferTo(destFile);}catch (IOException e){e.printStackTrace();}try{ // 通过getHost方法回显,获得文件名return ApiRestResponse.success(getHost(new URI(httpServletRequest.getRequestURI()+ "")) + "/files/" + newFileName);}catch (URISyntaxException e) {return ApiRestResponse.error(PlatformExceptionEnum.UPDATE_FAILED);}}
//回显方法
private URI getHost(URI uri){URI effectiveURI;try{effectiveURI = new URI(uri.getScheme(),uri.getUserInfo(),uri.getHost(),uri.getPort(),null,null,null);}catch( URISyntaxException e){effectiveURI = null;}return effectiveURI; }
Constant的内容,需要注意的是@Value("${file.upload.dir}")中$符号后的是一对{},这里我已经踩过坑了。
对应在application.properties中的配置是,需要注意的是从本地计算机中复制过来的地址样式会是D:\src\main...,需要把\改成/,才能被正常读取,否则用这个路径去保存是一定会找不到的。另外结尾也要记得加上/,因为代码中是直接将地址和文件名拼接在一起,然后保存的,所以需要加上/。
注意的是,代码中还没有包含对静态资源的映射,需要添加一个config实现,缺少这个会影响保存后的显示