错误原因:

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. 基于 WinCC OA 构建分布式可视化平台

    ​WinCC OA 的全称是:SIMATIC WinCC Open Architecture,是西门子工业自动化品牌SIMATIC系列的一部分.专门针对客户定制大型和/或复杂的应用以及需要满足特定系统 ...

  2. ElasticSearch之cat templates API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/templates?v=true&pretty" --cacert $ES ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (173)-- 算法导论13.3 2题

    二.用go语言,将关键字41.38.31.12.19.8连续地插入一棵初始为空的红黑树之后,试画出该结果树. 文心一言: 首先,我们需要了解红黑树的性质.红黑树是一种自平衡二叉查找树,其中每个节点要么 ...

  4. Numpy计算近邻表时间对比

    技术背景 所谓的近邻表求解,就是给定N个原子的体系,找出满足cutoff要求的每一对原子.在前面的几篇博客中,我们分别介绍过CUDA近邻表计算与JAX-MD关于格点法求解近邻表的实现.虽然我们从理论上 ...

  5. 介绍一个prometheus监控数据生成工具

    prometheus-data-generator Prometheus数据模拟工具旨在通过配置文件模拟Prometheus数据,用于测试和开发目的.该工具允许您生成用于测试和开发的合成数据. 配置 ...

  6. Spring源码学习笔记5——注册BeanPostProcessor,初始化事件多播器,注册事件监听器

    一丶前言 上篇Spring容器回调完所有的BeanFactoryPostPocessor,之后可以做到替换所有占位符,解析所有配置类等工作,这篇还会迎来一个Spring留给我们扩展的一个接口,涉及到A ...

  7. picker组件增加搜索item条目的功能

    picker组件顶部有搜索框,能搜索条目,如果条目很多的时候,上下翻很麻烦了,而且不容易找到,可以先全查,然后js搜索 wxml <button bindtap="openFlag&q ...

  8. 边缘AI方案落地问题探讨

    摘要:本文介绍了如何兑现边缘AI带来好处的承诺,并针对边缘AI落地和商业闭环发起的开源社区工作. 本文分享自华为云社区<华为云:边缘AI方案落地问题探讨及调研>,作者: 华为云边缘云创新实 ...

  9. 鸿蒙轻内核源码分析:虚拟文件系统 VFS

    本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二一 01 虚拟文件系统VFS>,作者:zhushy . VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际 ...

  10. Scala学习系列(二)——环境安装配置

    Scala下载地址:https://www.scala-lang.org/download/ 一.安装JDK 首先,因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK 二.二进制 ...