AsyncHttpClient + SpringMvc 批量上传文件,后端接收文件的参数名相同
最新项目后端使用SpringMvc,后端代码如下:
//使用 pic,接收多个文件
@RequestMapping("/upload.dhtml")
@ResponseBody
public String test3(CommonsMultipartFile[] pic) {
// do upload
return "success";
}
Android 前端使用 AsyncHttpClient,发现无法实现批量上传问题,问题如下。
1、Android 读取到文件后,压缩为 InputStream,最终得到List<InputStream>
List<File> files = ...;
List<InputStream> streams = 压缩(files);
2、AsyncHttpClient 提供的上传文件有2个方法
public void put(String key, InputStream stream) {
put(key, stream, null);
}
public void put(String key, File files[]) throws FileNotFoundException {
put(key, files, null, null);
}
3、对于 InputStream 并没有提供批量上传的方法,如果使用文件批量上传,不得不如下操作
List<InputStream> streams = ...;
File[] files = 创建临时文件(streams);
RequestParams params = getRequestParams();
params.put("pic", files);
这样的缺点是显而易见的!!!
那么,如何解决呢?
1、继承 RequestParams ,实现一个批量添加Stream的方法,如下:
put(String key, List<InputStream> streams);
2、修改后端代码,使用不同的key接收多个文件,如:
//使用 pic0,pic1,pic2 接收多个文件
@RequestMapping("/upload.dhtml")
@ResponseBody
public String test3(CommonsMultipartFile pic,CommonsMultipartFile pic1,CommonsMultipartFile pic2) {
// do upload
return "success";
}
3、后端放弃Spring的自动装配,自己处理文件上传,忽略掉文件名
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if(multipartResolver.isMultipart(request)){
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if(file != null){
// 处理文件上传 写磁盘
}
}
}
分析:
1、直接Pass掉,不到万不得已不修改第三方库,维护性和稳定性考虑
2、Pass掉,虽然能实现,但是实现方式太不和谐了,而且需要限制前端批量上传的个数
3、Pass掉,这种方式的性能比Spring 自动装配差很多。
解决办法:
前端上传时使用不同的key来表示文件,如
RequestParams params = getRequestParams();
List<InputStream> streams = ...;
for(int i=0;i<strams.size();i++){
params.put("pic["+i+"]",strams.get(i));
}
后端代码:
//使用 picObj,接收多个文件
@RequestMapping("/upload.dhtml")
@ResponseBody
public String test3(Pics picObj) {
List<CommonsMultipartFile> pic = picObj.getPic();
for(CommonsMultipartFile file:pic){
// do upload
}
return "success";
}
class Pics{
private List<CommonsMultipartFile> pic;
public List<CommonsMultipartFile> getPic() {
return pic;
}
public void setPic(List<CommonsMultipartFile> pic) {
this.pic = pic;
}
}
搞定。。
分享到:
相关推荐
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载...基于ssm的学生资助管理系统(前端 jsp、jquery,后端 springmvc、spring、mybatis)(角色分为:管理员、学生).zip
基于ssm的超市收银与会员管理系统:前端jsp、jquery,后端 springmvc、spring、mybatis,集成变化图管理、会员管理、商品类别管理、商品管理、账号充值、礼品管理以及统计等功能于一体的系统.zip 基于ssm的超市收银...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用!...基于ssm的学生资助管理系统源码+项目说明(前端 jsp、jquery,后端 springmvc、spring、mybatis)(角色分为:管理员、学生).zip
基于ssm的超市收银与会员管理系统:前端jsp、jquery,后端 springmvc、spring、mybatis,集成变化图管理、会员管理、商品类别管理、商品管理、账号充值、礼品管理以及统计等功能于一体的系统.zip
SpringMvc实现移动接口开发,使用RestFul的url风格的接口开发,实现语言java,该Demo只是一个简单的项目例子,便于学习理解,该项目数据库sql有误读者自己创建:数据库(student_manage),表名(student),字段(id,...
web前后端分离开发,后端SpringMVC java开发内含spirngMVC代码以及java-json处理包 详细内容可以参考我的博客https://blog.csdn.net/weixin_38879056/article/details/90758420 以及配套的前端vue项目...
基于SSM框架的学生综合素质测评管理系统_前端 jsp、ajax,后端 springmvc、spring、mybatis;角色分为管理员、教师和学生;管理员管理后台学生和教师信息,对学生成绩进行管理,对综合评测进行管理等;教师对奖惩信息进行...
基于ssm的校园垃圾分类管理系统_前端 jsp、jquery、easyui,后端 springmvc、spring、mybatis,角色分为管理员、学生;集成文明倡导、垃圾袋信息、商品信息、商品兑换等功能于一体的系统.zip
在这个“SpringMVC文件上传,多文件上传实例”中,我们将深入探讨如何在SpringMVC环境中实现文件上传功能,包括单个文件上传以及多个文件的批量上传。 1. **文件上传原理**: 文件上传是通过HTTP协议的POST请求来...
标题中的“Web学生课程表基于前端vue2,tailwind,bootstrap后端springMVC,springboot.zip”揭示了一个Web应用程序的开发项目,该程序用于管理学生的课程表。这个项目使用了现代前端技术和后端框架来构建,具体技术栈...
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、...
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、...
在这个项目中,我们将深入探讨如何使用Spring MVC作为后端控制器来处理文件上传,以及Vue.js在前端如何与之配合。 首先,我们需要在Spring MVC的Controller层创建一个方法来接收文件。这个方法通常会使用`@...
综上所述,结合`SpringMVC`和`Ajax`的文件上传解决方案能提供流畅的用户体验,同时短视频背景和`a`标签绑定文件域的技巧进一步提升了界面的交互性。在实际开发中,还需要考虑安全性、错误处理以及性能优化等问题,...
总结来说,实现"springMVC测试上传文件并在页面上显示"的功能,需要处理前端的文件选择与提交,后端的文件接收、存储和解析,以及前端的数据展示。涉及的技术包括HTML5表单、Spring MVC的`@RequestParam`、`...
以下将详细讲解SpringMVC如何实现单文件上传、多文件上传、文件列表显示以及文件下载。 1. **单文件上传** 在SpringMVC中,我们可以使用`@RequestParam("file") MultipartFile file`注解来接收前端提交的单个文件...
总之,这个"springMVC文件上传demo"提供了一个完整的文件上传解决方案,包括前端表单、后端控制器、异常处理以及必要的配置。通过学习和实践这个Demo,开发者可以快速掌握SpringMVC环境下文件上传的实现方式。
基于SSH的公司内部管理系统源码+项目说明(前端 Jsp,后端 Spring SpringMVC Hibernate,系统角色分为总经理、部门经理、普通员工,经理和员工通过该系统完成考勤数据录入,员工之间可以文档共享,消息沟通等).zip
在Spring MVC框架中实现文件上传并提供进度条功能是一项实用且复杂的任务,涉及到前端与后端的交互以及数据传输过程的监控。以下是对这个主题的详细解析。 首先,我们需要理解Spring MVC的基本工作原理。Spring MVC...