最近在做web网盘的系统,网盘最基本的功能便是文件上传,但是文件上传当遇到大文件的时候,在web端按传统方式上传简直是灾难,所以大文件上传可以采用分片上传的办法。其主要思路是:1.大文件上传时进行分片;2.分片上传;3.对分片文件进行合并。
思路比较清晰简单,但一些问题在于:1.大文件如何进行分片?2.分片如何进行记录和存储?3.如何校验每个分片文件的唯一性和顺序性?4.如何合并文件?
对于大文件如何分片,这个主要是在前端进行解决,在这里推荐大家用百度的WebUploader来实现前端所需。
对于对分片之后的文件进行存储的问题,我采用了临时文件存储的办法,临时文件存储着每个分块对应字节位的状态。
对于分片文件的区分,这里可以采用MD5码的方式(不清楚MD5码的可以先查一下),MD5码简单理解就像每个文件的身份证一样,每个不同的文件都有自己唯一的MD5码。
对于合并文件的时候,前端在对文件分片之后,在请求服务端合并的时候,请求中要带上分片序号和大小,服务器按照请求数据中给的分片序号和每片分块大小算出开始位置,与读取到的文件片段数据,写入文件即可。这里合并后的文件会存储俩个路径,一个是当前网盘目录下的路径,一个是真实的永久路径(目的是为了实现秒传的功能)。
前端分片的代码就不贴了,主要用的百度的WebUploader。
这里主要贴一些服务端的主要的代码
文件上传
/**
* 上传文件
*
* @param file 文件
* @param wholeMd5 文件整体md5码
* @param name 文件名
* @param type 文件类型
* @param lastModifiedDate 上传时间
* @param size 文件大小
* @param chunks 文件分块数
* @param chunk 正在执行的块
*/
@ApiOperation(value = "文件上传", hidden = true)
@IgnoreUserToken
@ApiResponses({
@ApiResponse(code = 500, response = RestError.class, message = "错误")
})
@PostMapping(value = "upload")
public ResponseEntity fileUpload(@ApiParam(name = "文件") @RequestPart MultipartFile file,
@ApiParam(name = "md5") @RequestParam String wholeMd5,
@ApiParam(name = "名称") @RequestParam String name,
@ApiParam(name = "类型") @RequestParam String type,
@ApiParam(name = "日期") @RequestParam Date lastModifiedDate,
@ApiParam(name = "大小") @RequestParam long size,
@ApiParam(name = "开始位置") @RequestParam long start,
@ApiParam(name = "结束位置") @RequestParam long end,
@ApiParam(name = "总分块数") @RequestParam(name = "chunks", defaultValue = "1") int chunks,
@ApiParam(name = "第几个分块,从0开始") @RequestParam(name = "chunk", defaultValue = "0") int chunk) {
try {
log.info("文件开始上传");
this.fileServiceImpl.fileUpload(file.getInputStream(), wholeMd5, name, type, lastModifiedDate, size, chunks, chunk, start, end);
return ResponseEntity.ok(1);
} catch (Exception e) {
return new ResponseEntity(RestError.IO_ERROR.setReason(e.getMessage()).toString(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Override
public boolean fileUpload(InputStream fileIS,
String wholeMd5,
String name, String type,
Date lastModifiedDate, long size,
int chunks,
int chunk,
long start,
long