java 分片上传


@Service
public class SliceFileService {

    @Resource
    private MinioService minioService;

    @Resource
    private MinioProperties minioProperties;

    private String getBucketPathDir(String md5) {
        return DateUtil.format(DateUtil.date(), "yyyy/MM/dd/") + "slice/" + md5;
    }

    private String getBucketPath(String md5, Integer sliceIndex) {
        return getBucketPathDir(md5) + "/slice_" + sliceIndex;
    }

    public void assertMd5Index(String md5, Integer indexOrTotal) {
        Assert.notNull(md5, "文件md5不能为空");
        Assert.notNull(indexOrTotal, "分片或总数不能为空");
    }

    public void upload(FileSliceUploadReq req) {
        Assert.notNull(req, "上传对象不能为空");
        Integer sliceIndex = req.getSliceIndex();
        String md5 = req.getMd5();
        assertMd5Index(md5, sliceIndex);
        String bucketName = minioProperties.getBucketName();
        String bucketPath = getBucketPath(md5, sliceIndex);
        //保存minio
        minioService.upload(bucketName, bucketPath, req.getFile());
    }

    private void removeSlice(String md5, Integer sliceTotal, String bucketName) {

        //异步执行
        ThreadPoolUtil.execute(() -> {
            // 删除所有的临时分片文件
            List<DeleteObject> delObjects = Stream.iterate(0, i -> ++i)
                    .limit(sliceTotal)
                    .map(i -> new DeleteObject(getBucketPath(md5, i)))
                    .collect(Collectors.toList());
            minioService.removeFiles(bucketName, delObjects);
        });
    }

    public SysFile composeFile(FileSliceUploadReq req, SysFile sysFile) {
        String md5 = req.getMd5();
        Integer total = req.getSliceTotal();
        assertMd5Index(md5, total);
        List<ComposeSource> source = Stream.iterate(0, i -> ++i).limit(total).map(i ->
                        ComposeSource.builder()
                                .bucket(minioProperties.getBucketName())
                                .object(getBucketPath(md5, i))
                                .build())
                .collect(Collectors.toList());

        minioService.composeFile(sysFile.getBucketName(), sysFile.getBucketPath(), source);
        removeSlice(req.getMd5(), req.getSliceTotal(), sysFile.getBucketName());
        StatObjectResponse objectInfo = minioService.getObjectInfo(sysFile.getBucketName(), sysFile.getBucketPath());
        if (null != objectInfo) {
            sysFile.setSize(objectInfo.size());
        }
        return sysFile;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值