环境:windows 7
网络:本机或局域网
架构:基于maven的j2ee springMVC
测试结果:可上传620MB左右的文件,如果更大的文件 —> 提示“目标文件”被占用
结论:java拥有跨平台特性,在Api方面不注重方便高效,更多侧重于兼容,对文件无法做到及时有效关闭。
目标:多线程、分片上传,目前无时间安排
1、springMvc 的 servlet加入以下代码(允许上传):
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
- 1
2、前端代码片段
引入webuploader css文件,jquery.js文件 webuploader.js 文件,本示例为springMVC,片段代码:
<div id="thelist" class="uploader-list"></div>
<div style="margin:20px 20px 20px 0;">
<div id="picker" class="form-control-focus">选择文件</div>
</div>
<button id="btnSync" type="button" class="btn btn-warning">开始同步</button>
<!-- 省略上面代码 -->
<script>
var uploader = WebUploader.create({
// swf文件路径
swf : _ctxRes
+ '/assets/global/plugins/webuploader-0.1.5/Uploader.swf',
// 文件接收服务端。
server : _ctx + '/test-sync/sync',
chunked : true,
threads : 1,
fromData : {
guid : 'guid'
},
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick : '#picker',
// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
resize : false
});
// 当有文件被添加进队列的时候
uploader.on('fileQueued', function(file) {
//alert(123);
$("#thelist").append(
'<div id="' + file.id + '" class="item">'
+ '<h4 class="info">' + file.name + '</h4>'
+ '<p class="state">等待上传...</p>' + '</div>');
});
uploader.on('uploadSuccess', function(file) {
$('#' + file.id).find('p.state').text('已上传');
});
uploader.on('uploadError', function(file) {
$('#' + file.id).find('p.state').text('上传出错');
});
uploader.on('uploadComplete', function(file) {
$('#' + file.id).find('.progress').fadeOut();
});
$("#btnSync").on('click', function() {
if ($(this).hasClass('disabled')) {
return false;
}
uploader.options.formData.guid = Math.random();
uploader.upload();
});
</script> </body>
3、服务器端代码
/**
* 单个文件同步接口
*
* @param request
* @return
* @throws JsonGenerationException
* @throws JsonMappingException
* @throws IOException
*/
@SuppressWarnings("resource")
@RequestMapping(value = "/test-sync/sync", produces = "text/plain;charset=UTF-8")
@ResponseBody
public String sync(
@RequestParam(value = "file", required = false) MultipartFile file,
HttpServletRequest request, HttpServletResponse response)
throws JsonGenerationException, JsonMappingException, IOException {
if (request.getParameter("chunk") == null) {
String realPath = request.getSession().getServletContext()
.getRealPath("/Upload/");
String fileName = file.getOriginalFilename();
File targetFile = new File(realPath, fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
file.transferTo(targetFile); // 小文件,直接拷贝
return "";
} else {
int chunk = Integer.parseInt(request.getParameter("chunk")); // 当前分片
int chunks = Integer.parseInt(request.getParameter("chunks")); // 分片总计
String realPath = request.getSession().getServletContext()
.getRealPath("/Upload/");
String Ogfilename = file.getOriginalFilename();
File tempFile = new File(realPath, Ogfilename);
OutputStream outputStream = new FileOutputStream(tempFile, true);
InputStream inputStream = file.getInputStream();
byte buffer[] = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
return "";
}
}