大文件断点续传

在这里插入图片描述

public void uploadBySlice(UploadFileReq uploadFileReq) {
        byte[] bytes = uploadFileReq.getBytes();
        if(bytes==null){
            throw new ServiceException("请上传文件");
        }

        String base = sysConfig.getStaticArticleAccessPath().substring(0, sysConfig.getStaticArticleAccessPath().lastIndexOf("/") + 1);
        String basePath = "/"  + base + "temp";//临时文件路径
        String filePath = adaptSystem(CommonUtils.getProjectPath() + basePath);
        String newFileName = uploadFileReq.getMd5Code() + "_" + uploadFileReq.getIndex() + ".tmp";
        //删除之前的临时文件
        File f = new File(filePath, newFileName);
        if(f.exists()){
            f.delete();
        }
        //文件写入到磁盘中
        boolean flag = FileUtils.fileWriteOut(bytes,filePath,newFileName);
        if (flag == false) {
            throw new ServiceException("文件上传失败");
        }
        //成功上传的文件分片index
        redisUtil.setZSetValue(FILE_UPLOAD + uploadFileReq.getMd5Code(), "" + uploadFileReq.getIndex(), uploadFileReq.getIndex());
    }
public Map mergeSlice(UploadFileReq uploadFileReq) throws IOException {
        String md5Code = uploadFileReq.getMd5Code();
        String base = sysConfig.getStaticArticleAccessPath().substring(0, sysConfig.getStaticArticleAccessPath().lastIndexOf("/") + 1);
        String tempPath = "/" + base + "temp";//临时文件路径

        String filePath = adaptSystem(CommonUtils.getProjectPath() + tempPath);
        String fileName = uploadFileReq.getFileName();
        String newFilePath = "/" + base + CommonUtils.createPath();
        //合并后文件名
        String basePath = adaptSystem(CommonUtils.getProjectPath() + newFilePath);
        String newFileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
        File f = new File(basePath, newFileName);
        if (!f.getParentFile().exists()) {
            f.getParentFile().mkdirs();
        }
        RandomAccessFile target = new RandomAccessFile(f, "rw");
        for (Integer i = 0; i < uploadFileReq.getCount(); i++) {
            RandomAccessFile r = null;
            try {
                r = new RandomAccessFile(new File(filePath, md5Code + "_" + i + ".tmp"), "r");
                //合并文件
                byte[] b = new byte[1024];
                int n = 0;
                while ((n = r.read(b)) != -1) {
                    target.write(b, 0, n);
                }
            } catch (FileNotFoundException e) {
                log.warn("分片上传临时文件被人手动删除-->md5Code:{} -->index:{}", md5Code, i);
                //删除redis上传分片成功数据,防止临时文件被删除导致多次上传失败
                redisUtil.delete(FILE_UPLOAD + uploadFileReq.getMd5Code());
                throw new ServiceException("文件上传不完整,请重新上传");
            } finally {
                if (r != null) {
                    r.close();
                }
            }
        }
        //合并成功后,删除临时文件
        log.info("md5Code:{}文件合并成功,准备删除临时文件", md5Code);
        deleteTempFile(filePath, md5Code, uploadFileReq.getCount());
        redisUtil.setValue(FILE_UPLOAD + uploadFileReq.getMd5Code(), newFilePath + "/" +newFileName);
        Map<String, String> res = new HashMap<>();
        res.put("state", "SUCCESS");
        res.put("original", fileName);
        res.put("url", newFilePath + "/" +newFileName);
        return res;
    }
public Object getUrlOrSliceIndex(UploadFileReq uploadFileReq) {
        String key = FILE_UPLOAD + uploadFileReq.getMd5Code();
        DataType type = redisUtil.getType(key);
        log.info("【getUrlOrSliceIndex】 key:{}, Type:{}", key, type.code());
        if(DataType.NONE.equals(type)){
            //没有上传过此文件
            return null;
        } else if (DataType.STRING.equals(type)){
            //文件已经上传并合并成功,可以直接获取url
            String url = redisUtil.get(FILE_UPLOAD + uploadFileReq.getMd5Code());
            if (!StringUtils.isEmpty(url) && url.lastIndexOf(".") > -1) {
                //此文件已经合并,防止有人手贱
                File file = new File(url);
                if (!file.exists()) {
                    redisUtil.delete(key);
                    return null;
                } else {
                    return url;
                }
            }
        } else if (DataType.ZSET.equals(type)){
            //文件上传被中断,或者合并失败需要重新上传
            Set<String> slices = redisUtil.setZSetRange(key, 0, -1);
            return slices;
        }

        return null;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值