大文件秒传,分片上传,断点续传

打印 上一主题 下一主题

主题 1807|帖子 1807|积分 5421

大文件分片上传

一 功能描述

1.文件通过web端分片多线程上传到服务端,然后web端发起分片合并,完成大文件分片上传功能
2.上传过的大文件,实现秒传
3.上传过程中,服务非常退出,实现断点续传
二 流程图


三 代码运行展示

1.分片上传


2.秒传


3.断点续传



四 代码结构


五 技术栈

1.springboot
2.aws存储
3.mysql
六 代码片段

  1. @ApiOperation(value = "大文件上传")
  2.     @PostMapping(value = "/big/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  3.     public RestResp<String> uploadChunk(
  4.             HttpServletRequest request,
  5.             BigFileChunkFo bigFileChunkFo, MultipartFile file) {
  6.         log.debug("分片上传参数:{}",bigFileChunkFo);
  7.         String result = fileManager.uploadChunk(request,bigFileChunkFo,file);
  8.         return RestResp.success(result);
  9.     }
  10.     @ApiOperation(value = "检查是否上传")
  11.     @PostMapping("/big/checkMd5")
  12.     public RestResp<BigFileCheckDto> checkMd5(
  13.             HttpServletRequest request,
  14.             @RequestBody BigFileCheckFo fileCheckFo) {
  15.         BigFileCheckDto bigFileCheckDto = fileManager.checkMd5(request,fileCheckFo);
  16.         return RestResp.success(bigFileCheckDto);
  17.     }
  18.     @ApiOperation(value = "大文件合并")
  19.     @PostMapping("/big/merge")
  20.     public RestResp<String> merge(
  21.             HttpServletRequest request,
  22.             @RequestBody BigFileMergeFo bigFileMergeFo) {
  23.         log.debug("文件合并:{}",bigFileMergeFo);
  24.         String result = fileManager.merge(request,bigFileMergeFo);
  25.         return RestResp.success(result);
  26.     }
复制代码
  1.     @Override
  2.     public String copyFile(String bucketName, String sourceFileKey, String targetFileKey) throws Exception {
  3.         log.info("bucketName:{},sourceFileKey:{},targetFileKey:{}",bucketName,sourceFileKey,targetFileKey);
  4.         CopyObjectRequest copyObjectRequest = new CopyObjectRequest();
  5.         copyObjectRequest.setSourceBucketName(bucketName);
  6.         copyObjectRequest.setDestinationBucketName(bucketName);
  7.         copyObjectRequest.setSourceKey(sourceFileKey);
  8.         copyObjectRequest.setDestinationKey(targetFileKey);
  9.         getClient().copyObject(copyObjectRequest);
  10.         return this.getObjectPrefixUrl(bucketName) +  targetFileKey;
  11. }
  12.     /**
  13.      * 上传分片
  14.      *
  15.      * @param bigFileChunkFo
  16.      * @return
  17.      * @throws Exception
  18.      */
  19.     @Override
  20.     public PartETag uploadChunk(BigFileChunkFo bigFileChunkFo, BigFile bigFile, MultipartFile multipartFile) throws Exception {
  21.         //桶名
  22.         String bucketName = bigFileChunkFo.getBucketName();
  23.         //当前分片
  24.         int chunkNum = bigFileChunkFo.getChunkNum();
  25.         //当前分片大小
  26.         long chunkSize = bigFileChunkFo.getChunkSize();
  27.         // 上传
  28.         ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(IOUtils
  29.                 .toByteArray(multipartFile.getInputStream()));
  30.         UploadPartRequest uploadRequest = new UploadPartRequest()
  31.                 .withBucketName(bucketName)
  32.                 .withKey(bigFile.getFileKey())
  33.                 .withUploadId(bigFile.getUploadId())
  34.                 .withInputStream(byteArrayInputStream)
  35.                 .withPartNumber(chunkNum)
  36.                 .withPartSize(chunkSize);
  37.         UploadPartResult uploadResult = getClient().uploadPart(uploadRequest);
  38.         return uploadResult.getPartETag();
  39.     }
  40.     /**
  41.      * 获取上传任务id
  42.      *
  43.      * @param bigFileCheckFo
  44.      * @param fileKey
  45.      * @return
  46.      */
  47.     @Override
  48.     public String getUploadId(BigFileCheckFo bigFileCheckFo, String fileKey) {
  49.         String bucketName = bigFileCheckFo.getBucketName();
  50.         InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName
  51.                 , fileKey);
  52.         log.info("initRequest:{}", initRequest);
  53.         InitiateMultipartUploadResult initResponse = getClient().initiateMultipartUpload(initRequest);
  54.         return initResponse.getUploadId();
  55.     }
  56.     /**
  57.      * 大文件合并
  58.      *
  59.      * @param bigFile
  60.      * @param bigFileChunkList
  61.      * @return
  62.      * @throws Exception
  63.      */
  64.     @Override
  65.     public String merge(BigFile bigFile, List<BigFileChunk> bigFileChunkList) throws Exception {
  66.         String bucketName = bigFile.getBucketName();
  67.         List<PartETag> partETagList = bigFileChunkList
  68.                 .stream()
  69.                 .map(bigFileChunk -> new PartETag(bigFileChunk.getChunkNum(), bigFileChunk.getETag()))
  70.                 .collect(Collectors.toList());
  71.         CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, bigFile.getFileKey(),
  72.                 bigFile.getUploadId(), partETagList);
  73.         log.info("compRequest:{}", compRequest);
  74.         getClient().completeMultipartUpload(compRequest);
  75.         return this.getObjectPrefixUrl(bucketName) + bigFile.getFileKey();
  76.     }
复制代码
七 表计划

  1. CREATE TABLE `hfle_big_file` (
  2.   `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  3.   `md5` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件MD5',
  4.   `status` int NOT NULL DEFAULT '1' COMMENT '上传状态,1:上传中;2:上传完成',
  5.   `access_key` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'accessKey',
  6.   `chunk_count` bigint DEFAULT NULL COMMENT '分片总数',
  7.   `file_name` varchar(240) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',
  8.   `file_size` bigint DEFAULT NULL COMMENT '文件大小',
  9.   `bucket_name` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '上传桶',
  10.   `file_type` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件类型',
  11.   `file_key` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件唯一值',
  12.   `url` varchar(256) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上传地址',
  13.   `upload_id` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 's3上传任务id',
  14.   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  15.   `creator` bigint NOT NULL DEFAULT '-1' COMMENT '创建人',
  16.   `modifier` bigint NOT NULL DEFAULT '-1' COMMENT '最后更新人',
  17.   `modified_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  18.   PRIMARY KEY (`id`) USING BTREE,
  19.   UNIQUE KEY `uniq_md5_access_key` (`access_key`, `md5`, `bucket_name`, `file_key`)
  20. ) ENGINE = InnoDB AUTO_INCREMENT = 47 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '大文件上传记录表';
  21. CREATE TABLE `hfle_big_chunck` (
  22.   `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  23.   `big_file_id` bigint DEFAULT NULL COMMENT '大文件id',
  24.   `chunk_num` bigint DEFAULT NULL COMMENT '当前分片',
  25.   `e_tag` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 's3上传专用',
  26.   `chunk_size` bigint DEFAULT NULL COMMENT '分片大小',
  27.   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  28.   `creator` bigint NOT NULL DEFAULT '-1' COMMENT '创建人',
  29.   `modifier` bigint NOT NULL DEFAULT '-1' COMMENT '最后更新人',
  30.   `modified_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  31.   PRIMARY KEY (`id`) USING BTREE,
  32.   UNIQUE KEY `uniq_chunk_num` (`big_file_id`, `chunk_num`)
  33. ) ENGINE = InnoDB AUTO_INCREMENT = 1542 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '大文件上传分片记录表'
复制代码
八 启动访问地址

http://localhost:9999
九 源代码下载

源码下载

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表