关于《 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;
    }

 

 

  

posted @ 2022-03-07 00:00  武卡卡  阅读(1197)  评论(0编辑  收藏  举报