错误原因:

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;
}

关于《 MultipartFile 的 file.transferTo 》 的坑的更多相关文章

  1. 关于Java数据转存的中MultipartFile转File的问题(转)

    转自http://www.cnblogs.com/zuoxiaoxia/p/6116942.html 错误背景:由于文件储存在第三方的服务器上,所有需要讲将接收到MultipartFile文件 转换为 ...

  2. [转]spring MultipartFile 转 File

    原文地址:https://www.jianshu.com/p/6cf99d39e170 File.createTempFile(String prefix, String suffix); 创建一个临 ...

  3. Springmvc 上传文件MultipartFile 转File

    转自:http://blog.csdn.net/boneix/article/details/51303207 业务场景:ssm框架 上传文件到应用服务器过程中要传到专有的文件服务器并返回url进行其 ...

  4. Multipartfile与File类型相互转换

    特殊情况下需要做转换 1.M转F File file = new File(path); FileUtils.copyInputStreamToFile(multipartFile.getInputS ...

  5. SpringMVC 上传文件 MultipartFile 转为 File

    在使用 SpringMVC 上传文件时,接收到的文件格式为 MultipartFile,但是在很多场景下使用都需要File格式的文件,记录下以便日后使用. 以下mFile为MultipartFile文 ...

  6. spring MVC 的MultipartFile转File读取

    转自:http://www.cnblogs.com/hahaxiaoyu/p/5102900.html 第一种方法:   MultipartFile file = xxx;         Commo ...

  7. MultipartFile 转换为File

    选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 . MultipartFile multipartFile; File fil ...

  8. springmvc 中将MultipartFile转为file,springboot 注入CommonsMultipartResolver

    第一种方法: MultipartFile file = xxx; CommonsMultipartFile cf= (CommonsMultipartFile)file; DiskFileItem f ...

  9. springmvc文件上传 参数为MultipartFile 转换为File

    package cn.com.mcd.controller;import java.io.File;import java.io.IOException;import java.io.Serializ ...

  10. spring MVC 的MultipartFile转File??

    MultipartFile file = xxx;         CommonsMultipartFile cf= (CommonsMultipartFile)file;         DiskF ...

随机推荐

  1. C++ Qt开发:TableView与TreeView组件联动

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableVi ...

  2. xml的语法总结

    xml的语法总结

  3. StringBuilder、StringBuffer

    StringBuilder 1.concat() 拼接字符串 2.indexOf() 查找 3.replace() 替换 4.subString(1,2) 截取 0,1,2 1开始 2结束 Strin ...

  4. CentOS连接网络设置

    https://blog.csdn.net/tsundere_x/article/details/104263100  用这个 VMware提供了三种将虚拟网卡和物理网卡捆绑起来的方式,即桥接(Bri ...

  5. MinIO客户端之ping

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc ping 检查指定的MinIO节点的服务是否可用. 不带参数,命令如下: ./mc ping local1 ...

  6. JavaFx之全局异常捕获(二十)

    JavaFx之全局异常捕获(二十) javafx开发时,我们有时候需要捕获未处理的异常.手动抛出的异常,在main方法中添加下面代码: public static void main(String[] ...

  7. JavaFx之Ikonli图标库大全(十五)

    JavaFx之Ikonli图标库大全(十五) Ikonli给java提供了大量的图标库, 官网:https://kordamp.org/ikonli/ Ikonli 提供了可以在 Java 应用程序中 ...

  8. Quartz.Net系列(八):Trigger之CalendarIntervalScheduleBuilder详解

    所有方法图 CalendarIntervalScheduleBuilder方法 在SimpleScheduleBuilder基础上实现了日.周.月.年 WithInterval:指定要生成触发器的时间 ...

  9. 云图说 | 通过Helm模板快速部署中间件应用

    摘要:通过全容器化Helm模板,快速部署中间件应用. 云容器引擎基于Kubernetes Helm标准的模板提供统一的资源管理与调度,高效地实现了模板的快速部署与后期管理,大幅简化了Kubernete ...

  10. 秋风到,ModelArts“ AI市场算法Fast-SCNN指南”秋膘贴起来

    本文分享自华为云社区<带你来秋日尝鲜 | ModelArts AI市场算法Fast-SCNN使用指导>,作者:Tianyi_Li 摘要:送小伙伴们一份新鲜出炉的ModelArts AI市场 ...