前言 最近用SpringBoot写文件上传功能,使用参数绑定之后确实是非常的方便了。但是,项目部署就出现了问题,搞得我一脸懵逼。后来,才发现是因为我使用了相对路径导致的,这个绝对是一个坑人的地方,不过也说明需要学习的东西还有很多!

案例再现

@PostMapping("/uploadFile")
public String uploadImg(@RequestParam("file") MultipartFile file, @RequestParam("equipmentId") String equipmentId) {String baseDir = "./imgFile";  // 这里不能直接使用相对路径if (!file.isEmpty()) {String name = file.getOriginalFilename();String prefix = name.lastIndexOf(".") != -1 ? name.substring(name.lastIndexOf(".")) : ".jpg";String path = UUID.randomUUID().toString().replace("-", "") + prefix;try {// 这里代码都是没有问题的File filePath = new File(baseDir, path);// 第一次执行代码时,路径是不存在的logger.info("文件保存路径:{},是否存在:{}", filePath.getParentFile().exists(), filePath.getParent());if (!filePath.getParentFile().exists()) {   // 如果存放路径的父目录不存在,就创建它。filePath.getParentFile().mkdirs();}// 如果路径不存在,上面的代码会创建路径,此时路径即已经创建好了logger.info("文件保存路径:{},是否存在:{}", filePath.getParentFile().exists(), filePath.getParent());// 此处使用相对路径,似乎是一个坑!// 相对路径:filePath// 绝对路径:filePath.getAbsoluteFile()logger.info("文件将要保存的路径:{}", filePath.getPath());file.transferTo(filePath);logger.info("文件成功保存的路径:{}", filePath.getAbsolutePath());return "上传成功";} catch (Exception e) {logger.error(e.getMessage());}}return "上传失败";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

我在日志中打印了路径的位置,显示是没有问题,当时一旦执行到file.transferTo(filePath);就会产生一个FileNotFoundException,但是我前面的代码是执行了,并且创建了一个文件夹的。

Postman测试截图

日志输出


2020-11-27 10:15:06.519  INFO 5200 --- [nio-8080-exec-1] r.controller.LearnController             : 文件保存路径:false,是否存在:.\imgFile
2020-11-27 10:15:06.521  INFO 5200 --- [nio-8080-exec-1] r.controller.LearnController             : 文件保存路径:true,是否存在:.\imgFile
2020-11-27 10:15:06.521  INFO 5200 --- [nio-8080-exec-1] r.controller.LearnController             : 文件将要保存的路径:.\imgFile\684918a520684801b658c85a02bf9ba5.jpg
2020-11-27 10:15:06.522 ERROR 5200 --- [nio-8080-exec-1] r.controller.LearnController             : java.io.FileNotFoundException: C:\Users\Alfred\AppData\Local\Temp
\tomcat.8080.2388870592947355119\work\Tomcat\localhost\ROOT\.\imgFile\684918a520684801b658c85a02bf9ba5.jpg (系统找不到指定的路径。)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意: 这里虽然没有什么头绪,当时观察日志可以发现,程序试图将文件保存到一个很奇怪的目录下,当是这个目录和前面那个filePath已经没有关系了,这里是一个疑点!

执行之后代码所在目录下面已经创建了一个imgFile目录

imgFile文件夹中是空的,因为执行transferTo时抛出了异常

修改此处传如的参数,改为文件的绝对路径

file.transferTo(filePath.getAbsoluteFile());
  • 1

Postman测试截图

上传成功!

执行之后代码所在目录下面已经创建了一个imgFile目录

imgFile文件夹中已经有了上传的图片

原因分析

上面失败与成功只是因为路径所代表的是相对路径和绝对路径的区别。这就说明是MultiparFile的transferTo方法有问题了。让我们加一个断点,调试走一波!debug!

补充一个debug的小知识:

debug tips:
step into: 单步执行,遇到子函数就进入并且继续单步执行(F5)
step over: 在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步(F6)
step return: 在单步执行到子函数内时,用step return就可以执行完子函数余下部分,并返回上一层。
setp out: 效果同 step return。

我这里只给file.transferTo(filePath.getAbsoluteFile());这行代码加了断点,这里我给出调试中最重要的两个步骤:

调试中代码的执行流程是:
但代码进入 transferTo 后,然后执行 this.part.write(dest.getpath)方法,进入 write 方法内部,到这里就可以得到我们的答案了!

@Override
public void transferTo(File dest) throws IOException, IllegalStateException {this.part.write(dest.getPath());if (dest.isAbsolute() && !dest.exists()) {// Servlet 3.0 Part.write is not guaranteed to support absolute file paths:// may translate the given path to a relative location within a temp dir// (e.g. on Jetty whereas Tomcat and Undertow detect absolute paths).// At least we offloaded the file from memory storage; it'll get deleted// from the temp dir eventually in any case. And for our user's purposes,// we can manually copy it to the requested location as a fallback.FileCopyUtils.copy(this.part.getInputStream(), Files.newOutputStream(dest.toPath()));}
}


http://www.taodudu.cc/news/show-5107942.html

相关文章:

  • springboot上传文件MultipartFile.transferTo()
  • transferto 文件不存在_通过通道复制文件transferTo
  • transferto遇到的问题
  • MultipartFile.transferTo(dest) 报 FileNotFoundException
  • MultipartFile的transferTo方法的坑
  • MultipartFile.transferTo()用法
  • transferto方法的应用_SpringMVC的 transferTo使用
  • java中transferto,Java 9新增的有趣方法InputStream.transferTo()
  • transferto 文件不存在_文件上传transferTo一行代码的bug
  • transferto方法的应用_FileChannel中transferTo方法的使用
  • transferTo 方法
  • java file transferto_jvm源码分析之FileChannel.transferTo()方法
  • transferto方法的应用_NIO的transferTo方法
  • transferto方法的应用_Java MultipartFile.transferTo方法代碼示例
  • java transferto_java.nio transferTo似乎不可能快?
  • transferto()方法,是springmvc封装的方法,用于图片上传时,把内存中图片写入磁盘
  • NIO中的零拷贝--transferTo
  • JS格式化日期、Javascript格式化日期对象、JS时间戳转化为日期对象
  • js格式化日期-年月日,时分秒
  • matlab gup绘图,Matlab GPU计算平台 Gisdom图形工作站得心应手
  • 技嘉计算机主板排行,2019人气电脑主板排名前十 买个好主板相当于给电脑买个好身体...
  • 基于centos7打造个人服务器(二):系统初始化
  • 水击计算的matlab程序,MATLAB GUI在油库管道水击压力计算中的应用
  • 截流式合流制设计流量计算_2016合流制排水管设计与计算.ppt
  • 天然气潮流计算matlab程序
  • 管道清理周期预测
  • 学习网站和书籍
  • 经济学家长江学者
  • 机器学习与因果推断
  • 一般回归问题、线性回归与模型的正确设定

MultipartFile的transferTo方法注意事项相关推荐

  1. 聊聊MultipartFile的transferTo方法

    默认已经知道:MultipartFile  这个类一般是用来接受前台传过来的文件. 那transferTo方法有什么作用呢? 打开源码: public void transferTo(File des ...

  2. MultipartFile的transferTo方法的坑

    前言 最近用SpringBoot写文件上传功能,使用参数绑定之后确实是非常的方便了.但是,项目部署就出现了问题,搞得我一脸懵逼.后来,才发现是因为我使用了相对路径导致的,这个绝对是一个坑人的地方,不过 ...

  3. 【SpringBoot】MultipartFile的transferTo()方法详解

    目录 背景 问题 源码分析 后记 背景 我们在编写Spring Boot应用中,常会遇到文件上传问题,Spring Boot Web提供了MutipartFile的文件支持,具体和File的区别可自行 ...

  4. MultipartFile的transferTo方法

    @RequiresPermissions("admin:user:import") @RequiresPermissionsDesc(menu = {"用户管理" ...

  5. transferto方法的应用_Java MultipartFile.transferTo方法代碼示例

    本文整理匯總了Java中org.springframework.web.multipart.MultipartFile.transferTo方法的典型用法代碼示例.如果您正苦於以下問題:Java Mu ...

  6. 学习笔记:MultipartFile中的transferTo方法

    学习笔记:MultipartFile中的transferTo(dest) 在文件上传的时候,MultipartFile中的transferTo(dest)方法只能使用一次; 并且使用transferT ...

  7. transferTo方法

    在文件上传的时候,MultipartFile中的transferTo(dest)方法只能使用一次;并且使用transferTo方法之后不可以在使用getInputStream()方法;否则再使用get ...

  8. MultipartFile中transferto报错

    MultipartFile中transferto报错 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp ...

  9. jQuery中append、insertBefore、after与insertAfter方法注意事项

    jQuery中append.appendTo.prepend.prependTo.before.insertBefore.after与insertAfter方法注意事项 这里列的是针对初学jQuery ...

最新文章

  1. 8位alu运算器(vhdl语言)_C语言中signed char类型,能表示-128到127,为什么负数多一位?...
  2. python中的if not语句_python中使用if not x 语句用法
  3. linux驱动helloworld
  4. Linux系统编程---4(进程间通信IPC,管道)
  5. 方法的重载(overload)和重写(override)的区别
  6. 知乎首次举办上星晚会 定档除夕前夜
  7. 【ElasticSearch】ElasticSearch在数十亿级别数据下,如何提高查询效率? 性能优化
  8. 人工智能急需网络安全“背书”
  9. dell电脑计算机专业,戴尔Dell专用英语_电脑基础知识_IT计算机_专业资料.doc
  10. 关于Spring事务管理的基础实例
  11. pytorch ImageFolder
  12. 如何在Word中打开公式编辑器
  13. Java实现飞机大战
  14. HBase 下载地址
  15. 电子管:6J1基本特性文献调研
  16. RTT笔记-分析自动初始化机制
  17. Play framework REST API
  18. kali虚拟机连接外网VMnet8显示无分配网络权限
  19. python语言是干什么的-python语言可以干什么
  20. u盘启动Linux什么时候可以拔下来,u盘装系统什么时候拔u盘|pe重装系统什么时候拔掉u盘...

热门文章

  1. OpenJudge1.5.24正常血压
  2. linux模拟手柄输入,linux下如何模拟按键输入和模拟鼠标
  3. MS project 2007 中将周六周日改为工作日
  4. 1024 程序员节岳麓对话即将开启,院士、掌门人开谈论道,话技术、聊人才、畅未来
  5. Android SDK 下载加速
  6. 用definemacro的方式检查信号的glitch毛刺
  7. “国家反诈中心APP”——手机里的防火墙
  8. CSS3边框、阴影及背景
  9. python progressbar
  10. 4G网速实测与WIFI使用对比