public @ResponseBody
String handleFileUpload(HttpServletRequest request){
List<MultipartFile>files =((MultipartHttpServletRequest)request).getFiles("file")
MultipartFile file = null
BufferedOutputStream stream = null
for (int i =0i<files.size()++i) {
file = files.get(i)
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes()
stream =
new BufferedOutputStream(new FileOutputStream(new File(file.getOriginalFilename())))
stream.write(bytes)
stream.close()
} catch (Exception e) {
stream = null
return "You failed to upload " + i + " =>" + e.getMessage()
}
} else {
return "You failed to upload " + i + " becausethe file was empty."
}
}
return "upload successful"
}
这是后台的实现,如果需要前端的实现,请回复
不管什么技术,超大文件上传(超出一次tcp上限)都是要做分片和合并的,无非是自己做还是找控件的差别。另外,springboot是后台接收,前端实现是由前端框架负责,比如vue。
以下是Vue+Springboot实现大文件上传的二种方式:
1、利用ElementUI的el-upload
优点:
简单方便,可以实现功能
缺点:
上传速度太慢,没有分片单线程上传1个G的文件即使在局域网也很慢
上传显示的进度条不准确,进度已经100%了,但是还需要等很久在服务端才生成完文
2、利用百度的webuploader
优点:
WebUploader是网上比较推荐的方式,分片上传大文件速度很快。
缺点:
必须依赖 jquery
不能 import 导入,只能在 index.html 里包含。
3. 利用vue-uploader
vue-uploader 是基于vue的uploader组件,缺省就是分片上传。
通过npm安装,基本流程参考github上的说明即可。
上传的基本原理就是前端根据文件大小,按块大小分成很多块,然后多线程同时上传多个块,同时调用服务端的上传接口,服务端会生成很多小块小块的文件。
所有块都上传完之后,前端再调用一个服务端的merge接口,服务端把前面收到的所有块文件按顺序组合成最终的文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)