广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MultipartFile中transferTo(File file)的路径问题及解决
  • 668
分享到

MultipartFile中transferTo(File file)的路径问题及解决

2024-04-02 19:04:59 668人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

transferTo(File file)的路径问题 今天看到layui的文件上传的控件,就尝试了一下。简单创建了一个springMVC项目。记得在配置文件中注入以下Bean。

transferTo(File file)的路径问题

今天看到layui的文件上传的控件,就尝试了一下。简单创建了一个springMVC项目。记得在配置文件中注入以下Bean。


<!-- 定义文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.WEB.multipart.commons.CommonsMultipartResolver">
    <!-- 设定默认编码 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
    <property name="maxUploadSize" value="5242880"></property>
    <!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
    <property name="maxInMemorySize" value="40960"></property>
    <!-- 上传文件的临时路径 -->
    <property name="uploadTempDir" value="fileUpload/temp"></property>
    <!-- 延迟文件解析 -->
    <property name="resolveLazily" value="true"/>
</bean>

我很懒,这些属性都没有配置,就注册了Bean。

接下来是我出错的地方。先上Controller代码,前台通过Layui的文件上传模块上传文件。


@ResponseBody
    @RequestMapping("/upload")
    public Map upload(httpservletRequest request,MultipartFile file){
        HashMap<String,String> map=new HashMap();
        if (!file.isEmpty()) {
            try {
                // getOriginalFilename()是包含源文件后缀的全名
                String filePath = "D:/upload/test/"+file.getOriginalFilename();
                System.out.println(filePath);
                File saveDir = new File(filePath);
                if (!saveDir.getParentFile().exists())
                    saveDir.getParentFile().mkdirs();
                file.transferTo(saveDir);
                map.put("res","上传成功");
                return map;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        map.put("res","上传失败");
        return map;
    }

transferTo方法中传递的file如果是路径的话,那么它会将最后一层路径当做文件名,没有后缀的那种。此时重命名这个文件,更改成和上传文件一致的后缀那么就可以打开了。

比如我将


String filePath = "D:/upload/test/"+file.getOriginalFilename();

改成


String filePath = "D:/upload/test";

运行之后打开文件发现这样的:

在这里插入图片描述

transferTo将我想作为文件夹的test当做文件名了。我加个后缀.jpg

在这里插入图片描述 

和上传的文件一致。

最后个人理解为传入的File参数是应该包含文件而不是文件路径,transferTo()并不会将文件转存到文件夹下。

MultipartFile.transferTo( )遇见的问题记录

环境:

  • Springboot 2.0.4
  • JDK8

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


<fORM enctype="multipart/form-data" method="POST"
    action="/file/fileUpload">
    图片<input type="file" name="file" />
    <input type="submit" value="上传" />
</form>

1.文件上传接值的几种方式

#spring.servlet.multipart.location=D:/fileupload1



@PostMapping("/upload")
@ResponseBody
public Map<String, Object> upload(HttpServletRequest httpServletRequest){
    boolean flag = false;
    MultipartHttpServletRequest multipartHttpServletRequest = null;
    //强制转换为MultipartHttpServletRequest接口对象 (它包含所有HttpServletRequest的方法)
    if(httpServletRequest instanceof MultipartHttpServletRequest){
        multipartHttpServletRequest = (MultipartHttpServletRequest) httpServletRequest;
    }else{
        return dealResultMap(false, "上传失败");
    }
    //获取MultipartFile文件信息(注意参数为前端对应的参数名称)
    MultipartFile mf = multipartHttpServletRequest.getFile("file");
    //获取源文件名称
    String fileName = mf.getOriginalFilename();
    //存储路径可在配置文件中指定
    File pfile = new File("D:/fileupload1/");
    if (!pfile.exists()) {
        pfile.mkdirs();
    }
    File file = new File(pfile,  fileName);
   
    try {
        //保存文件
        //使用此方法保存必须要绝对路径且文件夹必须已存在,否则报错
        mf.transferTo(file);
    } catch (IOException e) {
        e.printStackTrace();
        return dealResultMap(false, "上传失败");
    }
    return dealResultMap(true, "上传成功");
}

@PostMapping("/upload/MultipartFile")
@ResponseBody
public Map<String, Object> uploadMultipartFile(@RequestParam("file") MultipartFile multipartFile){
    String fileName = multipartFile.getOriginalFilename();
    try {
        //获取文件字节数组
        byte [] bytes = multipartFile.getBytes();
        //文件存储路径(/fileupload1/ 这样会在根目录下创建问价夹)
        File pfile = new File("/fileupload1/");
        //判断文件夹是否存在
        if(!pfile.exists()){
            //不存在时,创建文件夹
            pfile.mkdirs();
        }
        //创建文件
        File file = new File(pfile, fileName);
        //写入指定文件夹
        OutputStream out = new FileOutputStream(file);
        out.write(bytes);
    } catch (IOException e) {
        e.printStackTrace();
        return dealResultMap(false, "上传失败");
    }
    
    return dealResultMap(true, "上传成功");
}
@PostMapping("/upload/part")
@ResponseBody
public Map<String, Object> uploadPart(@RequestParam("file") Part part){
    System.out.println(part.getSubmittedFileName());
    System.out.println(part.getName());
    //输入流
    InputStream inputStream = null;
    try {
        inputStream = part.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
        return dealResultMap(false, "上传失败");
    }
    //保存到临时文件
    //1K的数据缓冲流
    byte[] bytes = new byte[1024];
    //读取到的数据长度
    int len;
    //输出的文件保存到本地文件
    File pfile = new File("/fileupload1/");
    if (!pfile.exists()) {
        pfile.mkdirs();
    }
    File file = new File(pfile, part.getSubmittedFileName());
    OutputStream out;
    try {
        out = new FileOutputStream(file);
        //开始读取
        while ((len = inputStream.read(bytes)) != -1){
            out.write(bytes, 0, len);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return dealResultMap(false, "上传失败");
    } catch (IOException e) {
        e.printStackTrace();
        return dealResultMap(false, "上传失败");
    }
    
    return dealResultMap(true, "上传成功");
}

注意:

MultipartFile.transferTo() 需要的事相对路径

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

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


//1.使用此方法保存必须指定盘符(在系统配置时要配绝对路径);
      // 也可以通过 File f = new File(new File(path).getAbsolutePath()+ "/" + fileName); 取得在服务器中的绝对路径 保存即可
//      file.transferTo(f);
      //2.使用此方法保存可相对路径(/var/falcon/)也可绝对路径(D:/var/falcon/)
      byte [] bytes = file.getBytes();
      OutputStream out = new FileOutputStream(f);
      out.write(bytes);

2.关于上传文件的访问

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


// 写一个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

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


@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;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MultipartFile中transferTo(File file)的路径问题及解决

本文链接: https://www.lsjlt.com/news/129588.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MultipartFile中transferTo(File file)的路径问题及解决
    transferTo(File file)的路径问题 今天看到layui的文件上传的控件,就尝试了一下。简单创建了一个SpringMVC项目。记得在配置文件中注入以下Bean。 ...
    99+
    2022-11-12
  • 关于Read-only file system问题的解决
    目录Read-only file system问题linux系统变为只读出现提示Read-only file system问题描述问题原因解决方法1.使用2.卸载只读分区3.fsck修复磁盘文件4.直接remount或者...
    99+
    2023-06-17
    Read-only file system问题 Read-only file system 解决Read-only file system
  • 怎么解决MYSQL中的Errcode: 17 - File exists问题
    本篇内容主要讲解“怎么解决MYSQL中的Errcode: 17 - File exists问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决MYSQL中...
    99+
    2022-10-19
  • Python相对路径报错:No such file or directory原因及解决方法
    当使用相对路径时,Python无法找到指定的文件或目录时会报错"No such file or directory"。这种情况通常是由以下原因引起的:1. 文件或目录不存在:请确保您提供的相对路径是正确的,并且文件或目录确实存在于指定的...
    99+
    2023-08-11
    Python
  • vue踩坑之backgroundImage路径问题及解决
    目录vue backgroundImage路径问题处理方法也可以下面这种方式去写vue style中设置background-image时的路径问题代码如下↓vue bac...
    99+
    2022-11-13
    vue踩坑 backgroundImage路径问题 vue backgroundImage路径
  • vue背景图片路径问题及解决
    目录vue背景图片路径vue避坑之背景图片路径的添加vue背景图片路径 共三种情况: <div class="about" :style="{backgroundImage:'...
    99+
    2022-11-13
  • 怎么解决mysql中的No such file or directory问题
    这篇文章主要讲解了“怎么解决mysql中的No such file or directory问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决mys...
    99+
    2022-10-19
  • 怎么解决mysql中unknown variable 'defaults-file问题
    本篇内容主要讲解“怎么解决mysql中unknown variable 'defaults-file问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
    99+
    2022-10-19
  • vue 图片路径 “@/assets“ 报错问题及解决
    目录问题解决为什么静态导入文件路径静态导入绝对路径动态导入相对路径动态导入绝对路径问题 在更改背景图片时写的图片相对路径是这样的: 由于@在webpack 被resolve.ali...
    99+
    2022-11-13
  • pythonOpenCV的imread不能读取中文路径问题及解决
    目录OpenCV的imread不能读取中文路径问题OpenCV imread()函数 (从文件加载图像)OpenCV的imread不能读取中文路径问题 import numpy as...
    99+
    2022-11-11
  • springboot中生成文件路径的问题及解决方法
    目录springboot生成文件路径举例springboot创建错误(路径)解决springboot生成文件路径 在进行 springboot 项目开发以及打包为 jar 包发布时,...
    99+
    2022-11-13
  • Apache中PHP API路径的常见问题及解决方案
    在使用Apache服务器时,你可能会遇到PHP API路径的问题。这些问题可能会导致你的PHP代码无法正常运行,因此解决这些问题非常重要。本文将介绍一些常见的PHP API路径问题及其解决方案。 问题1:找不到PHP API路径 当你在A...
    99+
    2023-08-30
    api apache path
  • Git的路径问题如何解决?
    Git是一款非常流行的版本控制工具,可以让我们更方便地管理代码。在使用Git的过程中,有时候会遇到路径问题,比如说在使用Git命令时,路径不正确,导致无法执行操作。这篇文章将介绍Git路径问题的解决方法,并提供一些演示代码帮助读者更好地理...
    99+
    2023-09-30
    path shell git
  • 解决Jupyter 文件路径的问题
    在使用Jupyter notebook时有这么一句代码 start_frame = imread(“OwnCollection\vehicles\Left\image0001.p...
    99+
    2022-11-11
  • 基于ClasspathResource路径问题的解决
    ClasspathResource路径问题 前言 在项目中工程以springboot jar形式发布,跟之前容器比少了一个解压目录,这个过程中出现了ClasspathResource...
    99+
    2022-11-12
  • Linux中的JavaScript路径问题解决方案?
    在Linux操作系统中,JavaScript路径问题一直是开发者们比较头疼的一个问题,因为在Linux系统中,文件路径和Windows系统中有所不同,如果不注意路径的书写格式,就会出现找不到文件的情况。那么,在Linux中如何解决JavaS...
    99+
    2023-10-12
    linux path javascript
  • Windows下ASP程序路径问题及解决方案
    好的,以下是文章内容: 在Windows平台下开发ASP程序时,经常会遇到路径问题,这是因为Windows和Linux等系统在路径处理上存在一定的差异。本文将介绍,并提供实际的演示代码。 一、路径问题的产生原因 1.1 相对路径和绝对路径...
    99+
    2023-09-02
    面试 path windows
  • Windows中fakepath路径问题怎么解决
    在 Windows 中,当我们在网页中上传文件时,浏览器会将文件的完整路径显示为 `fakepath`。这是出于安全考虑,以防止网站获取用户计算机上的真实文件路径。如果你希望获取真实的文件路径,可以使用以下方法之一解决 `fakepat...
    99+
    2023-08-11
    Windows
  • C#相对路径绝对路径的问题怎么解决
    这篇文章主要介绍“C#相对路径绝对路径的问题怎么解决”,在日常操作中,相信很多人在C#相对路径绝对路径的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#相对路径绝对路径的问题怎么解决”的疑惑有所...
    99+
    2023-06-18
  • Android studio的C盘中文路径问题解决
    请选择方案2 适用于win10系统 家庭版和专业版都可以 初遇安卓的坑,在安装软件前,特意查了注意事项,可是还是没防到这个中文路径的问题,真...
    99+
    2022-06-06
    Android Studio studio Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作