webuploader 获取文件md5_在浏览器进行大文件分片上传(java服务端实现)

0d931a3ee2c8653855b194395a3105ea.png

最近在做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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值