首页 > 其他分享 >关于MultipartFile中transferTo方法使用记录

关于MultipartFile中transferTo方法使用记录

时间:2022-12-07 11:23:55浏览次数:43  
标签:transferTo saveFile multipartFile String 记录 mp File MultipartFile

最近在项目中使用springboot写了一个文件上传的功能,但是遇到了路径上传错误的问题,以下是正确代码示范:

 1 @RequestMapping(value = "/sc/uploadAcceptanceData", method = RequestMethod.POST)
 2     @ResponseBody
 3     public Map<String, Object> uploadAcceptanceData(String metaData,MultipartFile[] uploadFile) {
 4         Map<String, Object> args = JSONUtils.stringToMap(metaData);
 5         Map<String, Object> mp = new HashMap<String, Object>();
 6         try {
 7             String name = args.get("NAME").toString();
 8             // 获取路径
 9             String storePath = CacheManagerOper.getEcmStores().get("store04").getStorePath();
10             String templatePath = storePath + File.separator + name + File.separator;
11             if (uploadFile != null && uploadFile.length > 0) {
12                 for (MultipartFile multipartFile : uploadFile) {
13                     // 获取文件原本的名字
14                     String originName = multipartFile.getOriginalFilename();
15                     // 保存文件的文件夹
16                     File saveFile = new File(templatePath+originName);
17                     // 判断路径是否存在,不存在则自动创建
18                     if (!saveFile.getParentFile().exists()) {
19                         saveFile.getParentFile().mkdirs();
20                     }
21                     //将文件保存在目标路径
22                     multipartFile.transferTo(saveFile.getAbsoluteFile());
23                 }
24                 mp.put("code", ActionContext.SUCESS);
25             }
26         } catch (Exception ex) {
27             mp.put("code", ActionContext.FAILURE);
28             mp.put("message", ex.getMessage());
29         }
30         return mp;
31     }

以下是错误代码示范

 1 @RequestMapping(value = "/sc/uploadAcceptanceData", method = RequestMethod.POST)
 2     @ResponseBody
 3     public Map<String, Object> uploadAcceptanceData(String metaData,MultipartFile[] uploadFile) {
 4         Map<String, Object> args = JSONUtils.stringToMap(metaData);
 5         Map<String, Object> mp = new HashMap<String, Object>();
 6         try {
 7             String name = args.get("NAME").toString();
 8             // 获取路径
 9             String storePath = CacheManagerOper.getEcmStores().get("store04").getStorePath();
10             String templatePath = storePath + File.separator + name + File.separator;
11             if (uploadFile != null && uploadFile.length > 0) {
12                 for (MultipartFile multipartFile : uploadFile) {
13                     // 获取文件原本的名字
14                     String originName = multipartFile.getOriginalFilename();
15                     // 保存文件的文件夹
16                     File saveFile = new File(templatePath+originName);
17                     // 判断路径是否存在,不存在则自动创建
18                     if (!saveFile.getParentFile().exists()) {
19                         saveFile.getParentFile().mkdirs();
20                     }
21                     //将文件保存在目标路径
22                     multipartFile.transferTo(saveFile);
23                 }
24                 mp.put("code", ActionContext.SUCESS);
25             }
26         } catch (Exception ex) {
27             mp.put("code", ActionContext.FAILURE);
28             mp.put("message", ex.getMessage());
29         }
30         return mp;
31     }

问题就出在了如下代码,我在日志中打印了路径的位置,显示是没有问题,当时一旦执行到下行代码就会产生一个FileNotFoundException,但是我前面的代码是执行了,并且创建了一个文件夹的。

 multipartFile.transferTo(saveFile);

修改此处传如的参数,改为文件的绝对路径,上传成功!

 multipartFile.transferTo(saveFile.getAbsoluteFile());

上面失败与成功只是因为路径所代表的是相对路径和绝对路径的区别。这就说明是MultiparFile的transferTo方法有问题了。下面看一下源码:

 1 @Override
 2 public void transferTo(File dest) throws IOException, IllegalStateException {
 3     this.part.write(dest.getPath());
 4     if (dest.isAbsolute() && !dest.exists()) {
 5         // Servlet 3.0 Part.write is not guaranteed to support absolute file paths:
 6         // may translate the given path to a relative location within a temp dir
 7         // (e.g. on Jetty whereas Tomcat and Undertow detect absolute paths).
 8         // At least we offloaded the file from memory storage; it'll get deleted
 9         // from the temp dir eventually in any case. And for our user's purposes,
10         // we can manually copy it to the requested location as a fallback.
11         FileCopyUtils.copy(this.part.getInputStream(), Files.newOutputStream(dest.toPath()));
12     }
13 }
14 @Override
15 public void write(String fileName) throws IOException {
16     File file = new File(fileName);
17     if (!file.isAbsolute()) {
18         file = new File(location, fileName);
19     }
20     try {
21         fileItem.write(file);
22     } catch (Exception e) {
23         throw new IOException(e);
24     }
25 }

通过源码分析我们可以知道,这是因为transferTo的参数,如果是相对路径的话,程序会自己拼接一个父路径,因为我指定的相对路径中带有一个不存在的路径,如果尝试保存是会失败的。但是如果你传入的参数只是一个文件名,那应该就能保存成功。

 

标签:transferTo,saveFile,multipartFile,String,记录,mp,File,MultipartFile
From: https://www.cnblogs.com/niuzihao/p/16962546.html

相关文章

  • imx6ull调试sx1268 lora调试记录
    1、sx1268原厂只有基于单片机的参考代码:​​https://github.com/Lora-net/LoRaMac-node​​2、如果基于linux平台使用,可以使用 github上sx1268代码​​https://github.com/......
  • 在Maven中出现javax.mail中文乱码问题解决记录
    学习Java时,看廖雪峰大神文章使用了javax.mail来发送SMTP邮件。在加入中文时,发现收到的邮件里中文都是乱码。按照一般经验,多半是编码的问题。然而在代码中,会涉及到编码的地......
  • 12月做题记录
    whk自闭,尤其是英语和化学。会按自己的感觉,按照NOIP2020难度打分。一.gym100212I(T2)题意:给你一个二分图,你要保留一些边使得每个点度数\(\geq2\),要让保留的边最少......
  • 坦克大战-记录玩家成绩
    预计实现效果实现步骤记录我方击毁敌方坦克数当游戏结束时,将数据写入到文件(IO)当退出时,记录坦克的坐标和方向将每个敌人信息,恢复成Node对象=>vector......
  • 20221206_每日学习记录
    20221206今天看了刘永鑫写的ImageGP包的代码和网站,感觉做的不错.代码是使用bash调用R的,可以学习一下,下面的操作地址是这里usage(){.....#......
  • 记录一个jmeter导入附件的工作过程
    系统性能测试,需要模拟生产环境需求搭建应用服务和建造压测数据,最大限度的还原生产环境,使系统性能测试的指标更加标准、真切。如某项目财务系统中的薪资管理模块做工资计算......
  • hdu1026 Ignatius and the Princess I --BFS & 记录路径 & 与DFS的比较
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1026​​一:题意一个n*m的矩阵代表一个迷宫,(0,0)是起点,(n-1)(m-1)是终点,每移动一步一秒。迷宫每点意义是:. 该点可以......
  • 记录搜索的例子 浙大c
    #include<stdio.h>struct{intamount;char*name;}coins[]={{1,"penny"},{5,"nickel"},{10,"dime"},{25,"quarter"},{50,......
  • 记录--uniapp自定义相机 自定义界面拍照录像闪光灯切换摄像头
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助因公司业务需要,需要开发水印相机功能,而项目代码用的uniapp框架,App端只能简单调用系统的相机,无法自定义界......
  • CentOS下nginx版本平稳升级记录
    起因:系统漏洞扫描出高危漏洞:CVE-2019-9513/CVE-2019-9511/CVE-2019-9516,需升级nginx。下载地址:https://nginx.org/en/download.html,选择了稳定版本1.22.1。将下载......