java 断点续传

3 篇文章 0 订阅

前言:

分片,服务器这边怎么处理接收

因为有需求需要对大文件进行切分。

所以了解一下断点续传是什么原理。

以及javaweb 需要怎么进行切分与约束。

需求中切片操作是APP端来进行的切片

1. 接口的定义

文件上传分片

分片可以根据实际上传时间确定,但每块不可以超出200M,最后一块不需要补齐,建议每块不小于10M。
index从1开始,+1递增

 

参数名称参数类型是否必须示例备注
groupT文本

 

本次提交分组标记(建议使用uuid)

indexT文本

 

分片序号(1、2、3)

blockData文件

 

文件流

因为服务器涉及到多个服务器 负载,

所以文件并不能直接扔到服务器上面,

放到阿里云上面。

最后在拼起来就好了~

MultipartFile file = multipartHttpServletRequest.getFile("blockData");

可以直接转成

file.getInputStream()

Input流文件~

因为之前是APP订单提交的时候进行提取文件中的txt内容来获取到json相关信息。

如果有断点续传之后,就可以进行拼接了。

2. 拼接的实现

提交的时候需要提供:

private String group;// 应该用UUID,来代表单号
private Integer maxIndex;

最大的的index

其实目的是把文件传到OSS

但是从OSS下下来转成OutputStream 然后不断往里面扔数据就好了

private String getLocalFilePath(MultipartFile zipData, OrderSubmitDTO orderSubmitDTO, String localVideoDirectory) throws IOException {
        Files.createDirectories(Paths.get(localVideoDirectory));
        String localVideoPath = localVideoDirectory + "/" + UuidUtils.getUUID() + ".zip";
        if(null == zipData){
            OutputStream outputStream = new FileOutputStream(new File(localVideoPath));
            for (int i = 1,len = orderSubmitDTO.getMaxIndex()+1; i < len; i++) {
                aliOssVideoService.videoDownload(OssProperties.OSS_BASE_PATH + OssProperties.OSS_TEMP_BASE_PATH
                        + orderSubmitDTO.getGroup().trim() + "/" + i , outputStream);
            }
            outputStream.flush();
            outputStream.close();
        }else {
            zipData.transferTo(new File(localVideoPath));
        }
        return localVideoPath;
    }

AliOssServiceImpl

@Override
    public void videoDownload(String ossFilePath, OutputStream outputStream) throws IOException {
        download(ossFilePath, outputStream);
    }

public void download(String ossUrl, OutputStream outputStream) throws IOException {
        OSSObject ossObject = OssClientFactory.getOssClient().getObject(ossProperties.getOssBucket(), ossUrl);
        InputStream in = ossObject.getObjectContent();
        if(null != in){
            int i;
            byte[] buffer = new byte[1024];
            while ((i = in.read(buffer)) != -1) {
                outputStream.write(buffer, 0, i);
            }
            in.close();
        }
    }

大体思想如下。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值