gpt4 book ai didi

解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 29 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

Spring Upload file 报错FileNotFoundException

环境:

  • Springboot 2.0.4
  • JDK8
  • 内嵌 Apache Tomcat/8.5.32

表单,enctype 和 input 的type=file 即可,例子使用单文件上传 。

?
1
2
3
4
5
< form enctype = "multipart/form-data" method = "POST"
  action = "/file/fileUpload" >
  图片< input type = "file" name = "file" />
  < input type = "submit" value = "上传" />
</ form >
?
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
@Controller
@RequestMapping ( "/file" )
public class UploadFileController {
     @Value ( "${file.upload.path}" )
     private String path = "upload/" ;
 
     @RequestMapping (value = "fileUpload" , method = RequestMethod.POST)
     @ResponseBody
     public String fileUpload( @RequestParam ( "file" ) MultipartFile file) {
         if (file.isEmpty()) {
             return "false" ;
         }
         String fileName = file.getOriginalFilename();
         File dest = new File(path + "/" + fileName);
         if (!dest.getParentFile().exists()) {
             dest.getParentFile().mkdirs();
         }
         try {
             file.transferTo(dest); // 保存文件
             return "true" ;
         } catch (Exception e) {
             e.printStackTrace();
             return "false" ;
         }
     }
}

运行在保存文件 file.transferTo(dest) 报错 。

问题

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

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

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

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

解决办法

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

?
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
@Controller
@RequestMapping ( "/file" )
public class UploadFileController {
     @Value ( "${file.upload.path}" )
     private String path = "upload/" ;
 
     @RequestMapping (value = "fileUpload" , method = RequestMethod.POST)
     @ResponseBody
     public 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)自己写到输出流中.

补充方法

application.properties 中增加配置项 。

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

关于上传文件的访问

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 写一个Java Config
@Configuration
public class webMvcConfig implements org.springframework.web.servlet.config.annotation.WebMvcConfigurer{
     // 定义在application.properties
     @Value ( "${file.upload.path}" )
     private String path = "upload/" ;
     public void addResourceHandlers(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 。

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

?
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
31
32
@RestController
@RequestMapping ( "/file" )
public class UploadFileController {
     @Autowired
     protected HttpServletRequest request;
     @Autowired
     protected HttpServletResponse response;
     @Autowired
     protected ConversionService 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( new FileInputStream(source), response.getOutputStream());
         } catch (Exception e) {
             e.printStackTrace();
         }
         return null ;
     }
}

MultipartFile.transferTo(dest) 报找不到文件

今天使用transferTo这个方法进行上传文件的使用发现了一些路径的一些问题,查找了一下记录问题所在 。

前端上传网页,使用的是单文件上传的方式 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
< html lang = "en" >
< head >
     < meta charset = "UTF-8" >
     < title >Title</ title >
     < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
</ head >
< body >
     < form enctype = "multipart/form-data" method = "post" action = "/upload" >
         文件:< input type = "file" name = "head_img" >
         姓名:< input type = "text" name = "name" >
         < input type = "submit" value = "上传" >
     </ form >
</ body >
</ html >

后台网页 。

?
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
@Controller
@RequestMapping ( "/file" )
public class UploadFileController {
     @Value ( "${file.upload.path}" )
     private String path = "upload/" ;
     @RequestMapping (value = "fileUpload" , method = RequestMethod.POST)
     @ResponseBody
     public String fileUpload( @RequestParam ( "file" ) MultipartFile file) {
         if (file.isEmpty()) {
             return "false" ;
         }
         String fileName = file.getOriginalFilename();
         File dest = new File(path + "/" + fileName);
         if (!dest.getParentFile().exists()) {
             dest.getParentFile().mkdirs();
         }
         try {
             file.transferTo(dest); // 保存文件
             return "true" ;
         } catch (Exception e) {
             e.printStackTrace();
             return "false" ;
         }
     }
}

这个确实存在一些问题 。

路径是不对的 。

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

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

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

所以改为:

?
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
@Controller
@RequestMapping ( "/file" )
public class UploadFileController {
     @Value ( "${file.upload.path}" )
     private String path = "upload/" ;
     @RequestMapping (value = "fileUpload" , method = RequestMethod.POST)
     @ResponseBody
     public 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" ;
         }
     }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/dany_zj_cn/article/details/82019253 。

最后此篇关于解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题的文章就讲到这里了,如果你想了解更多关于解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com