1、环境 myeclipse2014 、tomcat7、ubuntu
2、springMVC相关jar包,sdk1.2.6.jar,
3、项目运行在远程虚拟机ubuntu上,文件上传到阿里百川多媒体下。
4、问题:
4.1、单个或几个客户同时上传文件时上传成功,几十上百时只有部分上传成功,其余失败,而且不报错。过程表现为:服务器接收到文件数据,在阿里百川文件管理页面可以看到上传文件的信息,但最终只剩下上传成功的文件的信息,而上传失败的文件信息则从原来显示的表格中消失。查看日志,没有出现异常信息。猜想是方法调用出现问题(瞎猜),于是改用消息队列,先将请求放入队列,再一个个取出来上传。
4.2、以上改善后上传成功几率更小,上传失败出现异常:File has been moved - cannot be read again.
网上查到类似错误情形:分析有两种种原因 ①在配置spring MultipartResolver时不仅要配置maxUploadSize,还需要配置maxInMemorySize。但原因都没说的很清楚。只是简单说maxInMemorySize的默认值为10240 bytes(10K),超出这个大小的文件上传spring会先将上传文件记录到临时文件中。临时文件会被删除。②多线程,每个文件上传都开一个线程。
很显然,我用的是一个线程,所以不可能是后中情况。
所以只能从第一种情况来考虑。初次将maxInMemorySize设为40k测试没有半点效果,我的测试客户端上传文件都是3.2M的。十个客户端就是32M,很显然设置maxInMemorySize值用处不大。而且报错就是文件被移除,文件为什么会被移除,据说是apache内部原理,看不到也不懂。想了半天,最终我自己先把文件存在本地作为临时文件,再一个一个上传到目的地。
5、主要代码:
public class UploadFileMessage{
private String dir;
private Long userID;
private String fileType;
private String tempFilename;
private String filename;
get/set 省略
}
运用以上方法,大体解决了多客户端同时上传文件部分上传失败的问题。