关于《 MultipartFile 的 file.transferTo 》 的坑
错误原因:
Controller只能接收一次 MultipartFile的文件,
如果再将接收的 MultipartFile文件 传递给 其他的service ,
那么其他的 service 则获取不到这个 MultipartFile 文件 。
因为第一次接收会将MultipartFile文件放在一个临时区域,再将这个文件作为参数传递给其他的Service则会访问不到。
解决方法:
将 MultipartFile 转为 File 类型 传递即可
接下来,会通过案例来演示下这个问题的解决思路 :
演示的案例的功能描述:
用户注册时传入基本信息和 "头像图片文件" ,
为了方便,就编写了一个 FileController的类:用于 保存图片并返回存储图片的地址 ,存储到用户的数据库中
具体代码如下:
一,用户的服务
Controller层 : UserController.java
/** * 新增数据 * * @param user 实体 * @param file 上传的头像图片 * @return 新增结果 */ @ApiOperation("新增用户") @PostMapping("add") public ResponseData add(User user, MultipartFile file) { return this.userService.insert(user,file); }
Service层 : UserService.java
/** * 新增数据 * * @param user 实例对象 * @param file 上传的头像图片 * @return 实例对象 */ ResponseData insert(User user, MultipartFile file);
Service实现层: UserServiceImpl.java
/** * 新增数据 * * @param user 实例对象 * @param file 上传的头像图片 * @return 实例对象 */ @Override public ResponseData insert(User user, MultipartFile file) { //图片上传返回的路径 String imgPath= ""; if (file != null) { String username = user.getName(); // 获取文件类型 File tempFile = transferToFile.transferToFile(file); String fileType = FileUtil.getType(tempFile); String dirPath = "user/" + username + "/avatar/"; String fileName = UUID.randomUUID() + "." + fileType; /** * MultipartFile 文件只能接收一次,如果再以 MultipartFile 转给 其他的service , 那么其他的service 则获取不到这个 MultipartFile 文件 * 可以将 MultipartFile 转为 File 类型 传递即可 */ imgPath = fileService.upload(tempFile, dirPath, fileName); } user.setAvatar(imgPath); user.setCreateTime(new Date()); this.userDao.insert(user); return new ResponseData(ResponseDataEnum.Success); }
二,文件服务
Service层: FileService.java
/** * 文件上传。 * @param file * @param dirPath * @param fileName * @return */ public String upload(File file, String dirPath, String fileName);
Service实现层: FileServiceImpl.java
@Override public String upload(File file, String dirPath, String fileName) { dirPath = uploadPath + dirPath; fileName = dirPath + fileName; File filePath = new File(fileName); if (!filePath.getParentFile().exists()) { filePath.getParentFile().mkdirs(); } try { FileInputStream fis = null; fis = new FileInputStream(file); FileUtils.copyInputStreamToFile(fis, filePath);// 复制临时文件到指定目录下 } catch (Exception e) { e.printStackTrace(); } return null; }