oss断点下载--Java

本文介绍如何使用Java进行阿里云OSS的断点下载,重点在于利用只读Key确保安全并提供下载代码。

OSS下载

紧接上一篇的上传来说一下断点下载,需要上传的小伙伴可以看上一篇的断点上传0000

  1. 上传的时候我们需要拿到key和sercert,下载的i时候同样需要,不过下载的时候我们是只读,只需要拿到只读的key就可以实现我们想要的,这样也增加了安全性
public static final OSS getOSSClient() {
        OSS ossClient = new OSSClientBuilder().build(ALIYUN_OSS_ENDPOINT, ALIYUN_ACCESS_KEY_ID, ALIYUN_OSS_ACCESS_KEY_SECRET);
        return ossClient;
    }

下载代码

//下载文件    fileName=202020243054.jpg      filepath = 20200527/202020243054.jpg 
   //下载文件
    public static String download(String fileName, String filePath) throws FileNotFoundException {
        String result = null;
        ObjectMetadata objectMetadata = null;
        //只读的key
        String endpoint = OSS_ENDPOINT;
        String accessKeyId = OSS_ACCESSKEYID;
        String accessKeySecret = OSS_ACCESSKEYSECRET;
        String bucketName = OSS_BUCKET;
        //资源所在的文件夹名称
        //String objectName = "29020203";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        String[] split = filePath.split("/");
        String s = split[0];
        String dirpath = PIC_PATH + File.separator + s;
        //下载的文件名称
        File file = new File(dirpath);
        if (!file.exists()) {
            file.mkdirs();
        }
        //文件断点下载存储的文件地址
        String checkPoint = PIC_PATH + File.separator + "checkpoint";
        File checkpoint = new File(checkPoint);
        if (!checkpoint.exists()) {
            checkpoint.mkdirs();
        }

        boolean b = ossClient.doesObjectExist(bucketName, filePath);
        //判断文件是否存在
        if (b) {
            // 下载请求,10个任务并发下载,启动断点续传。   objectName : 文件的路径
            DownloadFileRequest downloadFileRequest = new DownloadFileRequest(bucketName, filePath);

            //存放的本地的文件路径
            //dirpath + File.separator +
            downloadFileRequest.setDownloadFile(dirpath + File.separator + fileName);
            downloadFileRequest.setPartSize(1 * 1024 * 1024);
            downloadFileRequest.setTaskNum(10);
            downloadFileRequest.setEnableCheckpoint(true);
//            downloadFileRequest.setCheckpointFile("checkpoint" + fileName);
            downloadFileRequest.setCheckpointFile(checkPoint + File.separator + fileName.substring(0, fileName.lastIndexOf(".")) + ".ucp");
            //downloadFileRequest.setCheckpointFile(checkPoint+File.separator);
            try {
// 下载文件。
                DownloadFileResult downloadRes = ossClient.downloadFile(downloadFileRequest);
// 下载成功时,会返回文件元信息。
                objectMetadata = downloadRes.getObjectMetadata();
                result = downloadRes.getObjectMetadata().getETag();
                //下载的文件可能存在损坏的情况,这个时候判断文件下载下来的crc和阿里云上的是否一致
                 //crc64加密   云服务
                Long serverCRC = downloadRes.getObjectMetadata().getServerCRC();
                //获取下载的本地流文件
                File files  = new File(dirpath + File.separator + fileName);
                if(files.exists()) {
                    //文件获取crc64
                    InputStream fileInputStream = new FileInputStream(files);
                    //读取流并且获取crc64
                    byte[] bytes = IOUtils.readStreamAsByteArray(fileInputStream);
                    CRC64 crc64 = new CRC64(bytes, bytes.length);
                    Long value1 = crc64.getValue();
                    //读取流关闭,不然删除不掉文件
                    fileInputStream.close();
                    if (serverCRC.longValue() != value1.longValue()) {
                    //删除破损的文件
                        files.delete();
                    }
                }
            } catch (NullPointerException e) {
                //OSS下载时checkpoint出错,抛出空指针错误,删除checkpoint
                file = new File(checkPoint + File.separator + fileName.substring(0, fileName.lastIndexOf(".")) + ".ucp");
                if (file.exists()) {
                    file.delete();
                }
                e.printStackTrace();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            } finally {
                // 关闭OSSClient。
                ossClient.shutdown();
            }
            return result;
        } else {
            throw new FileNotFoundException("文件不存在");
            //return "文件不存在";
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值