Spring Boot 使用 ServletFileUpload上传文件失败,upload.parseRequest(request)为空

近期在将servlet版本的项目改成springboot时使用Apache Commons FileUpload组件上传文件时总是返回null,调试发现ServletFileUpload对象为空,刚开始以为是请求request改变的原因,后面经过调试查找资料才发现在Spring Boot中有默认的文件上传组件。
在这里插入图片描述

调试发现每次运行到这一步之后的size返回的是0,没有值存在。在这里插入图片描述
接下来我们在SpringBoot中使用 commons-fileupload 上传文件。

方式一

1.pom.xml中添加依赖

 <!-- 文件上传所依赖的jar包 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

2.进行使用

@RequestMapping("/doUpload")
    public String doUpload(HttpSession session, HttpServletRequest request) throws IOException {
        long startTime = System.currentTimeMillis();
​
        //获取存储app文件夹的路径
        String appPath = session.getServletContext().getRealPath("/app");
        File appRootDir = new File(appPath);
        if (!appRootDir.exists()) {
            System.out.println("存储app的文件夹不存在 appPath= " + appPath);
            appRootDir.mkdirs();
        } else {
            System.out.println("存储app的文件夹存在 appPath= " + appPath);
        }
​
​
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
​
        if (multipartResolver.isMultipart(request)) {
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
​
            Iterator<String> names = multiRequest.getFileNames();
​
            while (names.hasNext()) {
                MultipartFile file = multiRequest.getFile(names.next().toString());
                if (file != null) {
                    File appFile = new File(appRootDir, file.getOriginalFilename());
                    file.transferTo(appFile);
                }
            }
        }
​
        long endTime = System.currentTimeMillis();
        System.out.println("上传时间:" + String.valueOf(endTime - startTime) + "ms");
        return "home";
    }
}

方式二

1.pom.xml中添加依赖(同上)
2.进行使用

private List<FileItem> getFile(HttpServletRequest request) {
	        // 获得磁盘文件条目工厂
	        DiskFileItemFactory factory = new DiskFileItemFactory();
	        // 如果没以下两行设置的话,上传大的文件会占用很多内存,
	        // 设置暂时存放的存储室 ,这个存储室,可以和最终存储文件的目录不同
	        /**
	         * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tmp
	         * 格式的 然后再将其真正写到 对应目录的硬盘上
	         */
	        String TEMP_FOLDER = "bb";
	        factory.setRepository(new File(TEMP_FOLDER));
	        // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
	        factory.setSizeThreshold(1024 * 1024);
	        // 高水平的API文件上传处理
	        ServletFileUpload upload = new ServletFileUpload(factory);
	        // 提交上来的信息都在这个list里面
	        // 这意味着可以上传多个文件
	        // 请自行组织代码
	        List<FileItem> list = null;
	        try {
	            list = upload.parseRequest(request);
	        } catch (FileUploadException e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        }
	        return list;
	    }

3.使用此方式的最重要一步(在配置文件中添加配置
在这里插入图片描述
去过滤掉springmvc的文件操作(如果使用的是springmvc框架可以去配置中删除即可,此因为springboot集成无法删除)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值