前端 AsyncHttpClient,后端 SpringMvc 批量上传文件解决

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


搞定。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值