transferto 文件不存在_文件上传时,MultipartFile.transferTo() 方法报 FileNotFoundException...

Spring Upload File 报错FileNotFoundException

环境:

Springboot2.0.4JDK1.8内嵌 Apache Tomcat/8.5.32

1、前端代码

前端上传网页表单,enctype 和 input 的type=file 即可,使用单文件上传举例:

图片

2、后端代码

@RestController

@RequestMapping("/file")public classUploadFileController {

@Value("${file.upload.path}")private String path = "upload/";

@RequestMapping(value= "fileUpload", method =RequestMethod.POST)

@ResponseBodypublic String fileUpload(@RequestParam("file") MultipartFile file) {if(file.isEmpty()) {return "false";

}

String fileName=file.getOriginalFilename();

File saveFile= new File(path + "/" +fileName);if (!saveFile.getParentFile().exists()) {

saveFile.getParentFile().mkdirs();

}try{

file.transferTo(saveFile);//保存文件

return "true";

}catch(Exception e) {

e.printStackTrace();return "false";

}

}

}

3、问题分析与解决

按照上面配置运行时,在保存文件 file.transferTo(saveFile) 报错

3.1 问题原因分析:

saveFile是相对路径,指向 upload/doc20170816162034_001.jpg

file.transferTo 方法调用时,判断如果是相对路径,则使用temp目录,为父目录

因此,实际保存位置为 C:\Users\xxxx\AppData\Local\Temp\tomcat.372873030384525225.8080\work\Tomcat\localhost\ROOT\upload\doc20170816162034_001.jpg

一则,位置不对,二则没有父目录存在,因此产生上述错误。

3.2 问题解决

transferTo 传入参数 定义为绝对路径

@RestController

@RequestMapping("/file")public classUploadFileController {

@Value("${file.upload.path}")private String path = "upload/";

@RequestMapping(value= "fileUpload", method =RequestMethod.POST)

@ResponseBodypublic String fileUpload(@RequestParam("file") MultipartFile file) {if(file.isEmpty()) {return "false";

}

String fileName=file.getOriginalFilename();

File dest= new File(new File(path).getAbsolutePath()+ "/" +fileName);if (!dest.getParentFile().exists()) {

dest.getParentFile().mkdirs();

}try{

file.transferTo(dest);//保存文件

return "true";

}catch(Exception e) {

e.printStackTrace();return "false";

}

}

}

也可以 file.getBytes() 获得字节数组,OutputStream.write(byte[] bytes)自己写到输出流中。

4、补充方法

application.properties 中增加配置项

spring.servlet.multipart.location= # Intermediate location of uploaded files.

关于上传文件的访问

增加一个自定义的ResourceHandler把目录公布出去

//写一个Java Config

@Configurationpublic class webMvcConfig implementsorg.springframework.web.servlet.config.annotation.WebMvcConfigurer{//定义在application.properties

@Value("${file.upload.path}")private String path = "upload/";public voidaddResourceHandlers(ResourceHandlerRegistry registry) {

String p= new File(path).getAbsolutePath() + File.separator;//取得在服务器中的绝对路径

System.out.println("Mapping /upload/** from " +p);

registry.addResourceHandler("/upload/**") //外部访问地址

.addResourceLocations("file:" + p)//springboot需要增加file协议前缀

.setCacheControl(CacheControl.maxAge(30, TimeUnit.MINUTES));//设置浏览器缓存30分钟

}

}

application.properties 中 file.upload.path=upload/

实际存储目录

D:/upload/2019/03081625111.jpg

访问地址(假设应用发布在http://www.a.com/)

http://www.a.com/upload/2019/03081625111.jpg

在Controller中增加一个RequestMapping,把文件输出到输出流中

@RestController

@RequestMapping("/file")public classUploadFileController {

@AutowiredprotectedHttpServletRequest request;

@AutowiredprotectedHttpServletResponse response;

@AutowiredprotectedConversionService conversionService;

@Value("${file.upload.path}")private String path = "upload/";

@RequestMapping(value="/view", method =RequestMethod.GET)public Object view(@RequestParam("id") Integer id){//通常上传的文件会有一个数据表来存储,这里返回的id是记录id

UploadFile file = conversionService.convert(id, UploadFile.class);//这步也可以写在请求参数中

if(file==null){throw new RuntimeException("没有文件");

}

File source= new File(new File(path).getAbsolutePath()+ "/" +file.getPath());

response.setContentType(contentType);try{

FileCopyUtils.copy(newFileInputStream(source), response.getOutputStream());

}catch(Exception e) {

e.printStackTrace();

}return null;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对“粘连”footer布局的思考和总结

经典的"粘连"footer布局 参考文章链接在文章末尾&#xff0c;简单的语言总结如下&#xff1a; 经典的“粘连”footer布局就是。我们有一块内容<main>。当<main>的高度足够长的时候&#xff0c;紧跟在<main>后面的元素<footer>会跟在<main…

计算机函数公式一等奖怎么算,信息技术应用 用计算机画函数图象教案设计(一等奖)...

卫鹏展地区&#xff1a; 湖北省 - 黄冈市 - 英山县学校&#xff1a;英山县金铺镇金铺中学 共1课时信息技术应用 用计算机画函数图象">信息技术应用 用计算机画… 初中数学 人教2011课标版 1教学目标1&#xff0e;结合具体情境理解一次函数的意义&#xff0c;能结…

这样去写你的 HTML

昨天在 twitter 上说&#xff0c;怎么忍心把页面写得这么难用&#xff1f;是的&#xff0c;这个世界还有一群人等着我们创建出来的东西&#xff0c;可以让他们的生活能过得更容易呢。比如那些需要读屏软件的用户。作为一个前端&#xff0c;我们又怎么会忍心呢。之前就一直想写这…

iframe懒加载_前端常见问题

原地址&#xff1a;https://blog.csdn.net/Mr_JavaScript/article/details/843110681. flex布局&#xff1a;又叫做弹性布局任何一个容器都可以指定flex布局&#xff0c;如display:flex 或 display:inline-flex注意&#xff1a;设置了flex布局以后&#xff0c;子元素的float&am…

手机运行服务器无响应,《最强蜗牛》服务器无响应怎么办 服务器无响应解决方法...

导读最强蜗牛服务器无响应怎么办&#xff1f;本作在今日迎来了正式的公测&#xff0c;这会导致大批量的玩家同时涌入进来&#xff0c;而服务器也因此而遭受到了非常大的符合&#xff0c;所以会导致后续加入进来的玩家出现服务器无响应进不去的现象。下面就为大家带...最强蜗牛服…

Android 开源框架Universal-Image-Loader学习

Android 开源框架Universal-Image-Loader完全解析&#xff08;一&#xff09;--- 基本介绍及使用 Android 开源框架Universal-Image-Loader完全解析&#xff08;二&#xff09;--- 图片缓存策略详解 Android 开源框架Universal-Image-Loader完全解析&#xff08;三&#xff09;…

自己动手写操作系统--个人实践

近期開始看于渊的《自己动手写操作系统》这本书&#xff0c;刚開始看就发现做系统的引导盘居然是软盘&#xff01;心里那个汗啊&#xff01; 如今都是U盘了&#xff0c;谁还用软盘。于是考虑用U盘。 于是開始下面步骤&#xff1a; 1、既然书上说给先要把软盘做引导盘&#xff0…

蔻驰和mk哪个更大牌_mk和coach哪个好?mk和coach包包是一个档次吗?

说到包包&#xff0c;mk和coach可谓是轻奢界的两大巨头了。因此&#xff0c;两个品牌的包包不可避免的会被经常拿来作比较。那么&#xff0c;从各个角度来讲mk和coach那款包包更好呢&#xff1f;这两款包包又有哪些本质上的区别呢&#xff1f;mk和coach哪个好价格对比大致上&am…

Linux 配置 swap 区

Linux 配置 swap 区 很多时候我们需要配置 swap 主要的原因是物理内存太贵了&#xff0c; 服务器也是一样&#xff0c; 当内存不够用时&#xff0c; 系统会卡死&#xff0c; 因此我们宁愿牺牲一点性能也要让系统正常运行。 当然&#xff0c; 在系统物理内存足够的条件下&#x…

嵊州职教中心计算机多少分数,嵊州中考考试分数线

每年六月份最热闹的大概就是中考了&#xff0c;很多人都想提前知道中考分数线&#xff0c;下面是百分网小编整理的嵊州2017年中考考试分数线&#xff0c;欢迎阅读借鉴!嵊州2017年中考分数线2017年嵊州中考考试时间嵊州中考录取情况1. 第一批 嵊州中学、马寅初中学实验班&#x…

12月和12年

刚刚撇了一眼&#xff0c;注册博客园已经12年了。时间有时只是个数字&#xff0c;有没有意义呢&#xff0c;自己去判断啦。 像博客园这样的技术社区&#xff0c;很是难得&#xff0c;虽然这个社区里.NET开发者才是一等公民。 我最喜欢的是它的博客系统的高度可Diy性。经常访问我…

【2011-6】【奇数】

Description 键盘输入一个奇数 P (P<50)&#xff0c;其个位数字不能是5&#xff0c;求一个整数 S&#xff0c;使 P*S 1111...1&#xff0c;即乘积各位都是1。要求用两行依次输出以下结果: ①S的全部数字&#xff1b;②乘积中数字1的个数。 例&#xff1a;输入P3&#xff0c…

sql加上唯一索引后批量插入_阿里大佬总结的52条SQL语句性能优化策略,建议收藏...

你知道的越多&#xff0c;不知道的就越多&#xff0c;业余的像一棵小草&#xff01;你来&#xff0c;我们一起精进&#xff01;你不来&#xff0c;我和你的竞争对手一起精进&#xff01;编辑&#xff1a;业余草cnblogs.com/SimpleWu/p/9929043.html推荐&#xff1a;https://www…

Web缓存技术

本章导读 缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈&#xff0c;所以读取大容量数据时&#xff0c;使用缓存来直接为客户端服务&#xff0c;可以减少客户端与服务器端的数据交互&#xff0c;从而大大提高程序的性能。 本章从缓存所在的命…

神武4手游服务器维护,神武4手游势不可挡开服时间表_神武4手游新区开服预告_第一手游网手游开服表...

2020-06-1910:00新服天涯刀客已经开服2020-06-0510:00新服飞仙摘星已经开服2020-05-2910:00新服踏雪无痕已经开服2020-05-2210:00新服因缘际会已经开服2020-05-1910:00新服龙的传人已经开服2020-05-1510:00新服鸾凤和鸣已经开服2020-05-1211:40新服其疾如风已经开服2020-05-081…

BZOJ 4066 简单题 ——KD-Tree套替罪羊树

【题目分析】 直接x,y二维轮番划分&#xff0c;暴力即可。 套上替罪羊&#xff0c;打碎重构&#xff0c;对于时间复杂度有了保证。 写起来好麻烦&#xff0c;重构的技巧很棒&#xff01; 【代码】 #include <cstdio> #include <cstring> #include <iostream>…

【HTML5初探之绘制图像(上)】看我canvas元素引领下一代web页面

弧度一块可能有误&#xff0c;需要再研究 导航 【初探HTML5之使用新标签布局】用html5布局我的博客页&#xff01; 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放 【HTML5初探之绘制图像&#xff08;上&#xff09;】看我canvas元素引领下一代web页面 【HTML5初…

或运算

逻辑或 ||int i, j, k;i 0x15;j 0x41;k i || j;反汇编代码如下:MOV DWORD PTR SS:[EBP-4], 15MOV DWORD PTR SS:[EBP-C], 41CMP DWORD PTR SS:[EBP-4], 0JNZ SHORT asm_OR.00401029CMP DWORD PTR SS:[EBP-C], 0JNZ SHORT asm_OR.00401029MOV DWORD PTR SS:[EBP-10], 0JMP SH…

构造方法的调用顺序和成员变量的初始化时机以及动态绑定

构造方法的调用顺序&#xff1a;子类构造器中&#xff0c;JVM会自动的先调用父类的构造方法&#xff0c;然后再执行子类构造方法。在JVM自动调用父类构造方法的时候&#xff0c;会完成父类中拥有的成员变量的值的初始化操作&#xff0c;此时子类的成员变量并未初始化&#xff0…

Python interview_python

https://github.com/taizilongxu/interview_python 1 Python的函数参数传递 strings, tuples, 和numbers是不可更改的对象&#xff0c;而list,dict等则是可以修改的对象 2 Python中的元类(metaclass) 3 staticmethod和classmethod python 三个方法&#xff0c;静态方法&#xf…