错误原因:

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. Ubuntu apt-get 的使用

    在Ubuntu中,可以使用apt-get命令来管理软件包.下面是一些常见的apt-get命令及其用法: 安装软件包: sudo apt-get install <package> 其中,& ...

  2. k8s在删除pod时优雅关闭sigterm信号传输失败

    背景 随着云原生技术的流行,越来越多的应用选择容器化,容器化的话题自然离不开 Kubernetes .Pod 是 Kubernetes 中创建和管理的.最小的可部署的计算单元,一个 Pod 中有多个容 ...

  3. Java并发(二十二)----wait notify的正确姿势

    开始之前先看看,sleep(long n) 和 wait(long n) 的区别: 1) sleep 是 Thread 的静态方法,而 wait 是 Object 的方法 2) sleep 不需要强制 ...

  4. c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?

    vlc.exe.lnk双击这个文件,能正常打开vlc,但是用System.Diagnostics.Process.Start(Path.GetFullPath("vlc.exe.lnk&qu ...

  5. flutter弹窗

    AlertDialog: 优点:Material风格的弹窗,具有灵活的布局和样式自定义能力.易于使用,并提供了标题.内容和操作按钮的选项. 缺点:对于复杂的自定义布局和样式可能不够灵活. Bottom ...

  6. redis的基本数据类型测试

    依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  7. 《华为云DTSE》期刊2023年第二季—HDC.Cloud 2023专刊

    本文分享自华为云社区<<华为云DTSE>期刊2023年第二季-HDC.Cloud 2023专刊>,作者: HuaweiCloudDeveloper . AI技术风起云涌,百家争 ...

  8. 通用漏洞评分系统 (CVSS)系统入门指南

    通用漏洞评分系统 (CVSS) 是一个公共框架 ,用于评估软件中安全漏洞的严重性.这是一个中立的评分系统,让所有企业能够使用相同的评分框架对各种软件产品(从操作系统.数据库再到 Web 应用程序)的 ...

  9. 十问ByteHouse:如何基于ClickHouse玩转向量检索?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 向量检索被广泛使用于以图搜图.内容推荐以及大模型推理等场景.随着业务升级与 AI 技术的广泛使用,用户期望处理的向 ...

  10. Jenkins Pipeline 流水线 - Parameters 参数化构建

    可以通过参数的方式,指定构建的版本 有两种方式 界面添加 Pipeline Script 脚本配置 (需要Build 一次,然后生效,不知道有没有其它办法) General 界面添加 Pipeline ...