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...相关推荐

  1. centos 下载文件很慢_百度云盘上传文件和下载文件慢的解决办法

    百度云盘上传文件和下载文件慢的解决办法 一:上传文件慢 1. 左下角点击搜索,输入cmd,右键以管理员身份运行 2. 在弹出的窗口中输入netsh interface tcp set global a ...

  2. vue 文件及描述信息一起上传_用Vue实现一个大文件上传和断点续传

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding ...

  3. python分片上传_分片上传_分片上传_上传文件_Python_SDK 示例_对象存储 OSS - 阿里云...

    OSS提供的分片上传(Multipart Upload)功能,将要上传的较大文件(Object)分成多个数据块(Part)来分别上传,上传完成后再调用CompleteMultipartUpload接口 ...

  4. 怎么在电脑安装php文件夹在哪个文件夹,php进行文件上传时找不到临时文件夹怎么办,电脑自动保存的文件在哪里...

    php进行文件上传时找不到临时文件夹怎么办PHP上传文件时找不到临时文件夹怎么办,php上传文件时找不到临时文件夹的解决方案:先打开php.ini配置文件:然后修改内容[upload _ tmp _ ...

  5. java 上传文件及预览_SpringBoot上传下载文件及在线预览

    SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...

  6. java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载

    Spring MVC框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过SpringMVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了不同上 ...

  7. ajax上传 java_使用Ajax进行文件与其他参数的上传功能(java开发)

    文件上传: 记得前一段时间,为了研究Ajax文件上传,找了很多资料,在网上看到的大部分是form表单的方式提交文件,对于Ajax方式提交文件并且也要提交表单中其他数据,发现提及的并不是很多,后来在同事 ...

  8. 大文件传输解决方案:分片上传 / 下载限速

    前言 不少项目中会遇到上传下载视频.更新包.应用程序等文件,此类文件的共同点就是十分巨大,我在项目中遇到过 4G 左右的文件同时 100 多台机器下载,此时如果用 post 上传和下载想一下都不可能, ...

  9. 上传文件慢,SpringBoot分片上传文件

    Java上传文件慢,大文件上传卡顿,请求超时怎么办? 话不多说直接上代码,代码复制过去可以直接使用 第一步:创建后端代码 package cn.leon.demo.rest;import lombok ...

  10. xshell上传本地文件命令_linux学习 XShell上传、下载本地文件到linux服务器

    (一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...

最新文章

  1. 求解斐波那契数列复杂度分析
  2. Android中一些有用的小方法(不定时更新)
  3. Linux下查看网卡信息及确定网卡位置以及更改网卡名称
  4. postgres建表
  5. SQL Drop数据库– MySQL,PostgreSQL,SQL Server
  6. 明天就是第四周的实训开始的时间
  7. native字体尺寸自适应 react_React Native之图片/宽高/字体平台适配
  8. iQOO5G手机卡槽公布
  9. 大数据工程师简历_成为大数据工程师所需的技能
  10. chorme流程图设计插件gliffy 的加载
  11. JxBrowser-JS调用和AJAX数据监听
  12. Clip_by_norm 函数理解
  13. php 采集网页 按xpath,网页数据采集相对XPATH使用教程 - 八爪鱼采集器
  14. 计算机win7卡顿如何解决方法,win7电脑出现卡顿怎么办_win7电脑卡顿严重解决方法...
  15. Little Gyro and Sort(第二届中国计量大学ACM程序设计竞赛个人赛)
  16. .net framework 3.5 无法验证证书签名,安装错误:0x80096004
  17. 华为OD机试 - We Are A Team
  18. android自动切换暗色,根据环境光亮度自动切换,让 Android 10 的暗色主题更智能:Auto Dark Theme...
  19. Ubuntu下软件包的清理与删除
  20. linux文件读取程序,Linux系统编程:文件的读取写入

热门文章

  1. python scipy样条插值函数大全(interpolate里interpld函数)
  2. 大数据学习——akka自定义RPC
  3. Mysql带返回值与不带返回值的2种存储过程
  4. 分析access.log
  5. (转)Http协议经典详解
  6. Client does not support authentication protocol requested by server;
  7. Java数字、货币格式化
  8. windows phone7资料整理
  9. 有赞美业微前端的落地总结
  10. 【重磅】Google官方推出了免费的、中文的、机器学习初级课程。