- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈MultipartFile中transferTo方法的坑由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言:最近用SpringBoot写文件上传功能,使用参数绑定之后确实是非常的方便了.
但是,项目部署就出现了问题,搞得我一脸懵逼.
后来,才发现是因为我使用了相对路径导致的,这个绝对是一个坑人的地方,不过也说明需要学习的东西还有很多! 。
我在日志中打印了路径的位置,显示是没有问题,当时一旦执行到file.transferTo(filePath);就会产生一个FileNotFoundException,但是我前面的代码是执行了,并且创建了一个文件夹的.
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 (系统找不到指定的路径。) 。
注意: 这里虽然没有什么头绪,当时观察日志可以发现,程序试图将文件保存到一个很奇怪的目录下,当是这个目录和前面那个filePath已经没有关系了,这里是一个疑点! 。
执行之后代码所在目录下面已经创建了一个imgFile目录 。
imgFile文件夹中是空的,因为执行transferTo时抛出了异常 。
修改此处传如的参数,改为文件的绝对路径 。
上传成功! 。
执行之后代码所在目录下面已经创建了一个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 方法内部,到这里就可以得到我们的答案了! 。
这个write方法,会判断传入的参数是否是相对路径,如果是相对路径,它会自己给我们拼接一个父路径! 所以你应该知道那个奇怪的路径是哪里来的了吧! 。
C:\Users\Alfred\AppData\Local\Temp\tomcat.8080.2388870592947355119\work\Tomcat\localhost\ROOT\.\imgFile\684918a520684801b658c85a02bf9ba5.jpg 。
好了,大概可以理清了,这是因为transferTo的参数,如果是相对路径的话,程序会自己拼接一个父路径,因为我指定的相对路径中带有一个不存在的路径,如果尝试保存是会失败的。但是如果你传入的参数只是一个文件名,那应该就能保存成功。但是这样,取文件的时候,又会遇到问题了,你可能都不知道文件在哪里! 。
这里还有一个很有意思的地方,如果我的相对路径中不使用 . 开头,而只是以 / 开头,那么又会产生一个好玩的情况了。第一种情况就算刚才那样的,这里我们来讨论第二种情况,这种情况在Windows系统中还是同第一种一样的错误,但是在Linux系统中,它是可以正常执行的。如果你了解一点两个系统的知识的话,就应该知道Linux系统的根路径就是 /,所以以 / 开头的路径即是绝对路径.
所以这也算是程序跨平台需要考虑的问题了,如果不了解Linux的话,你可能不会明白,这里我给出一个验证程序实际测试一下.
Windows系统和Linux系统运行结果不同的代码.
Windows运行结果 。
Linux运行结果 。
这里需要一个Linux环境,但是我的电脑上面没有,虽然我买了一台阿里云服务器。但是为了这么小小的一段代码登陆阿里云服务器去执行,我又嫌麻烦。还好我想到了一个更加巧妙的方法! 。
以前,知乎上面曾经有一个问题是关于菜鸟教程的,然后菜鸟教程的作者亲自出来回答了问题,并且贴了一张图片——菜鸟教程技术结构图谱 。
这个图片本身其实是涉及到了很多的,但是我们这里只关注一个就是在线代码提交执行,看到那只可爱的鲸鱼了吗?对,它就是docker。Docker里面就是一个完整的操作系统,并且是Linux系统! 。
好了,打开 菜鸟教程–>java教程–>随便找一个运行实例,进去删除原来的代码,复制我这个代码上去执行,输出结果!嘿嘿 。
注意:
有些在线代码执行是屏蔽了某些包的,所以有的也不一定是可以执行成功的,如果这里作者对在线代码提交执行做了那种限制,我们还是只能老老实实的去Linux系统上面执行了.
不过,有时候站在巨人的肩膀上,真的是挺轻松的! 。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们.
原文链接:https://blog.csdn.net/qq_40734247/article/details/110248410 。
最后此篇关于浅谈MultipartFile中transferTo方法的坑的文章就讲到这里了,如果你想了解更多关于浅谈MultipartFile中transferTo方法的坑的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
前言 每日站会(Daily Standup)是团队统一节奏的、在固定时间发生的、帮助团队内部快速同步进展的敏捷实践活动: 站会的目的是让团队能更好地对齐 Sprint 目标;
jdbcTemplate 中的queryForList,你真的懂吗? 你想象中的queryForList是不是应该长成下面这种模样? String sql = "select *
python是一门清晰简洁的语言,如果你对一些细节不了解的话,就会掉入到那些深不见底的“坑”里,下面,我就来总结一些python里常见的坑。 列表创建和引用 嵌套列表的创建 使用*号来创建一个
如今,在DevOps当中建立安全体系显得比以往任何时候都更加重要。《2021年企业DevOps技能提升报告》指出,56%的受访者表示DevSecOps已经成为自动化工具中的一大必备要素。然而,D
前言 相信看到这个题目,可能大家都觉得是一个老生常谈的月经topic了。一直以来其实把握一个“值传递”基本上就能理解各种情况了,不过最近遇到了更深一点的“小坑”,与大家分享一下。 首先还是从最简
前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下:
大家好,我是明哥。 在开始之前,先考你一个非常 Go 味的经典问题:如何判断一个 interface{} 的值是否为 nil ? 这也是面试有可能会被问到的一个问题,这个问题很 “迷”,平时
ava并发包有很大一部分内容都是关于并发容器的,因此学习和搞懂这部分的内容很有必要。 Java 1.5 之前提供的同步容器虽然也能保证线程安全,但是性能很差,而 Java 1.5 版本之后提供的并发
大家好,我是煎鱼。 前几天在读者交流群里看到一位小伙伴,针对 interface 的使用有了比较大的疑惑。 无独有偶,我也在网上看到有小伙伴在 Go 面试的时候被问到了:
我是一名优秀的程序员,十分优秀!