目标:实现一个多文件上传功能。
使用框架:spring,springmvc
1.搭建spring和springmvc框架,这个不在本次讲述内容,跳过。
2.在springmvc的配置文件中添加
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="1024"></property>
</bean>
其中:
CommonsMultipartResolver:用于检查请求中是否还有多媒体文件
defaultEncoding:编码格式
maxUploadSize:一次上传的总文件大小
maxInMemorySize:缓存大小
2.controller内容:
@ResponseBody
@RequestMapping(value = "/img", method = RequestMethod.POST)
public ResponseDataVo uploadImg(HttpServletRequest request, String thum) {
try {
List<FileBean> list = FileUploadImage.uploadFile(request);
if (list.size()>0) {
return ResponseDataVo.success(list);
}else{
return ResponseDataVo.error("图片上传失败!");
}
} catch (Exception e) {
SeparateLogger.error(e.getMessage(), e);
return ResponseDataVo.error("图片上传失败!");
}
}
接受文件上传的接口,ResponseDataVo是我自己的返回对象,不用管。
FileUploadImage中的代码:
/**
* 上传图片
*
* @param request
* @return
* @throws Exception
*/
public static List<FileBean> uploadFile(HttpServletRequest request) throws Exception {
// 创建一个通用的多部分解析器
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()) {
try {
// 记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
// 取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
/** MultipartFile转File */
CommonsMultipartFile cf = (CommonsMultipartFile) file;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File f = fi.getStoreLocation();
//一下可以编写自己的业务代码,保存的文件
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
// break;
}
}
return list;
}
其中返回的list中的对象是文件名和地址,是我自己的业务对象,不用管。
3.碰到的问题:
a.小文件上传过程提示找不到tmp文件
原因:maxInMemorySize 设置太大,小文件的缓存到内存中,没有写入磁盘临时文件
b.多个文件上传,名字一样,只上传了一张图片
原因:
Iterator<String> iter = multiRequest.getFileNames();
迭代器是获取filename,filename传入的值相同,迭代器以为是一个文件。解决方式:多个文件上传,每个文件名称设置不一样。