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;
}
}
transferto 文件不存在_文件上传时,MultipartFile.transferTo() 方法报 FileNotFoundException...相关推荐
- centos 下载文件很慢_百度云盘上传文件和下载文件慢的解决办法
百度云盘上传文件和下载文件慢的解决办法 一:上传文件慢 1. 左下角点击搜索,输入cmd,右键以管理员身份运行 2. 在弹出的窗口中输入netsh interface tcp set global a ...
- vue 文件及描述信息一起上传_用Vue实现一个大文件上传和断点续传
前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding ...
- python分片上传_分片上传_分片上传_上传文件_Python_SDK 示例_对象存储 OSS - 阿里云...
OSS提供的分片上传(Multipart Upload)功能,将要上传的较大文件(Object)分成多个数据块(Part)来分别上传,上传完成后再调用CompleteMultipartUpload接口 ...
- 怎么在电脑安装php文件夹在哪个文件夹,php进行文件上传时找不到临时文件夹怎么办,电脑自动保存的文件在哪里...
php进行文件上传时找不到临时文件夹怎么办PHP上传文件时找不到临时文件夹怎么办,php上传文件时找不到临时文件夹的解决方案:先打开php.ini配置文件:然后修改内容[upload _ tmp _ ...
- java 上传文件及预览_SpringBoot上传下载文件及在线预览
SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...
- java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载
Spring MVC框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过SpringMVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了不同上 ...
- ajax上传 java_使用Ajax进行文件与其他参数的上传功能(java开发)
文件上传: 记得前一段时间,为了研究Ajax文件上传,找了很多资料,在网上看到的大部分是form表单的方式提交文件,对于Ajax方式提交文件并且也要提交表单中其他数据,发现提及的并不是很多,后来在同事 ...
- 大文件传输解决方案:分片上传 / 下载限速
前言 不少项目中会遇到上传下载视频.更新包.应用程序等文件,此类文件的共同点就是十分巨大,我在项目中遇到过 4G 左右的文件同时 100 多台机器下载,此时如果用 post 上传和下载想一下都不可能, ...
- 上传文件慢,SpringBoot分片上传文件
Java上传文件慢,大文件上传卡顿,请求超时怎么办? 话不多说直接上代码,代码复制过去可以直接使用 第一步:创建后端代码 package cn.leon.demo.rest;import lombok ...
- xshell上传本地文件命令_linux学习 XShell上传、下载本地文件到linux服务器
(一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...
最新文章
- 求解斐波那契数列复杂度分析
- Android中一些有用的小方法(不定时更新)
- Linux下查看网卡信息及确定网卡位置以及更改网卡名称
- postgres建表
- SQL Drop数据库– MySQL,PostgreSQL,SQL Server
- 明天就是第四周的实训开始的时间
- native字体尺寸自适应 react_React Native之图片/宽高/字体平台适配
- iQOO5G手机卡槽公布
- 大数据工程师简历_成为大数据工程师所需的技能
- chorme流程图设计插件gliffy 的加载
- JxBrowser-JS调用和AJAX数据监听
- Clip_by_norm 函数理解
- php 采集网页 按xpath,网页数据采集相对XPATH使用教程 - 八爪鱼采集器
- 计算机win7卡顿如何解决方法,win7电脑出现卡顿怎么办_win7电脑卡顿严重解决方法...
- Little Gyro and Sort(第二届中国计量大学ACM程序设计竞赛个人赛)
- .net framework 3.5 无法验证证书签名,安装错误:0x80096004
- 华为OD机试 - We Are A Team
- android自动切换暗色,根据环境光亮度自动切换,让 Android 10 的暗色主题更智能:Auto Dark Theme...
- Ubuntu下软件包的清理与删除
- linux文件读取程序,Linux系统编程:文件的读取写入