fileupload插件调用upload.parseRequest(request)解析得到空值问题

本文主要是介绍fileupload插件调用upload.parseRequest(request)解析得到空值问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java Web下接收文件常基于fileupload插件实现,其一般代码如下:
index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>Title</title>
</head>
<body>
<form action="/test/file" enctype="multipart/form-data"method="post">上传用户:<input type="text" name="username"/><br/>上传文件:<input type="file" name="file2"/><br/><input type="submit" value="提交"/>
</form>
</body>
</html>

对应的后台Controller代码:

    @RequestMapping(value = "/test/file")@ResponseBodypublic String file (HttpServletRequest request,HttpServletResponse response) throws IOException{response.setContentType("application/json;charset=utf-8");try{//使用Apache文件上传组件处理文件上传步骤://1、创建一个DiskFileItemFactory工厂DiskFileItemFactory factory = new DiskFileItemFactory();//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB/*//设置上传时生成的临时文件的保存目录factory.setRepository(tmpFile);*///2、创建一个文件上传解析器ServletFileUpload upload = new ServletFileUpload(factory);//监听文件上传进度upload.setProgressListener(new ProgressListener(){public void update(long pBytesRead, long pContentLength, int arg2) {System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);}});//解决上传文件名的中文乱码upload.setHeaderEncoding("UTF-8");//3、判断提交上来的数据是否是上传表单的数据if(!ServletFileUpload.isMultipartContent(request)){//按照传统方式获取数据return;}//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MBupload.setFileSizeMax(1024*1024*10);//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MBupload.setSizeMax(1024*1024*30);//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> list = upload.parseRequest(request);for(FileItem item : list){//如果fileitem中封装的是普通输入项的数据if(item.isFormField()){String name = item.getFieldName();//解决普通输入项的数据的中文乱码问题String value = item.getString("UTF-8");//value = new String(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name + "=" + value);}else{//如果fileitem中封装的是上传文件//得到上传的文件名称,String filename = item.getName();System.out.println(filename);if(filename==null || filename.trim().equals("")){continue;}//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt//处理获取到的上传文件的文件名的路径部分,只保留文件名部分filename = filename.substring(filename.lastIndexOf("\\")+1);//得到上传文件的扩展名String fileExtName = filename.substring(filename.lastIndexOf(".")+1);filename = filename.substring(0,filename.lastIndexOf("."));//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法System.out.println("上传的文件的扩展名是:"+fileExtName);//保存文件FileManager fileManager = new FileManager();if(FileManager.ERROR.equals(fileManager.save(filename,fileExtName,"song",item.getInputStream()))){return JsonUtil.statusResponse(1,"上传文件失败",null);}}}}catch (FileUploadBase.FileSizeLimitExceededException e) {e.printStackTrace();return JsonUtil.statusResponse(1,"单个文件超出最大值!!!",null);}catch (FileUploadBase.SizeLimitExceededException e) {e.printStackTrace();return JsonUtil.statusResponse(1,"上传文件的总的大小超出限制的最大值!!!",null);}catch (Exception e) {e.printStackTrace();return JsonUtil.statusResponse(1,"其他异常,上传失败!!!",null);}return JsonUtil.statusResponse(0,"上传文件成功",fileManager.getFileURI(filename,fileExtName));}

我是在SpringBoot下测试时,发现的该问题,即在解析请求时List list = upload.parseRequest(request);得到的list size=0,也就是根本没有得到文件数据。我在网上搜索该问题的解决方法,大致有以下两种:
(1)原因在于Spring的配置文件中已经配置了MultipartResolver,导致文件上传请求已经被预处理过了,所以此处解析文件列表为空,对应的做法是删除该段配置。
(2)认为是structs的过滤器导致请求已被预处理,所以也要修改对应过滤器的配置。
然而,在SpringBoot下,上述两种解决方法不可能做到,因为SpringBoot的相关配置都是自己完成的,根本没有显示的配置文件。况且以上两种解决方法,修改配置文件可能影响整个工程的其他部分,所以得另寻方案。
我通过断点调试该Controller代码,发现传入的参数HttpServletRequest实例已经为StandardMultipartHttpServletRequest 对象了,且其结构中包含整个form表单的所有字段信息,我就想,区别于网上已有的两种解决方案,总是想避免这种预处理,何不就利用这种预处理,来简化自己的代码结构呢?于是就有了下面的解决代码。其方法很简单,就是对传入的request做强制转型,从而可以根据StandardMultipartHttpServletRequest 实例方法得到相关form表单数据,从而大大简化代码结构,示意如下:

@RequestMapping(value = "/file")@ResponseBodypublic String file (HttpServletRequest request, HttpServletResponse response) throws IOException {...try {StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request;Iterator<String> iterator = req.getFileNames();while (iterator.hasNext()) {MultipartFile file = req.getFile(iterator.next());String fileNames = file.getOriginalFilename();int split = fileNames.lastIndexOf(".");//存储文件//文件名  fileNames.substring(0,split)//文件格式   fileNames.substring(split+1,fileNames.length())//文件内容 file.getBytes()...}}catch (Exception e){e.printStackTrace();return "fail";}return "success";}

这篇关于fileupload插件调用upload.parseRequest(request)解析得到空值问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128311

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装