Java调用阿里云对象存储OSS

一、准备

没有注册阿里云账号的去注册账号并实名

没有开通对象存储OSS,开通对象存储OSS

阿里云官网:https://www.aliyun.com/

OSS控制台:https://oss.console.aliyun.com/

新人福利会场:https://www.aliyun.com/1111/new?userCode=r85k1yor

官方文档:https://help.aliyun.com/product/31815.html

二、新建Bucket

在这里插入图片描述
在这里插入图片描述

三、AccessKey 管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
请记住申请完子用户AccessKey后不要立即关闭窗口,先将申请的AccessKeySecret进行保存,因为关闭后,再也没办法进行查看AccessKeySecret,只能查看到AccessKeyId。

四、开发

4.1、maven

<dependencies>
    <!--aliyun-oss-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.10.2</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

4.2、上传文件

在OSS中,操作的基本数据单元是文件(Object)。OSS Java SDK提供了以下几种文件上传方式:

  • 简单上传:包括流式上传和文件上传。最大不能超过5GB。
  • 表单上传:最大不能超过5GB。
  • 追加上传:最大不能超过5GB。
  • 断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。
  • 分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。

上传过程中,您可以设置文件元信息,也可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。

4.2.1、简单上传

简单上传是指通过PutObject方法上传单个文件(Object)。简单上传包括流式上传和文件上传,流式上传使用InputStream作为OSS文件的数据源,文件上传使用本地文件作为OSS文件的数据源。本文介绍如何使用流式上传和文件上传方式上传文件。

4.2.1.1、流式上传

使用流式上传,您可以将数据流上传到OSS文件。文件和文件夹不在在时,可以自动创建。

上传字符串

public class OssUploadString {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 填写字符串。
        String content = "Hello OSS";

        // 创建PutObjectRequest对象。
        // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
        PutObjectRequest putObjectRequest = new PutObjectRequest("java521", "testData/test01.txt", new ByteArrayInputStream(content.getBytes()));

        // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
        //ObjectMetadata metadata = new ObjectMetadata();
        //metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        //metadata.setObjectAcl(CannedAccessControlList.Private);
        //putObjectRequest.setMetadata(metadata);

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

上传Byte数组

public class OssUploadByteArray {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 填写Byte数组。
        byte[] content = "Hello, Mr. Xu".getBytes();
        // 依次填写Bucket名称、Object完整路径、。Object完整路径中不能包含Bucket名称。
        ossClient.putObject("java521", "testData/test02.txt", new ByteArrayInputStream(content));

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

上传网络流

public class OssUploadNetworkStram {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 填写Byte数组。
        byte[] content = "Hello, Mr. Xu".getBytes();
        // 填写网络流地址。
        InputStream inputStream = null;
        try {
    
    
            inputStream = new URL("https://amap.java521.com/").openStream();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        // 依次填写Bucket名称、Object完整路径、。Object完整路径中不能包含Bucket名称。
        ossClient.putObject("java521", "testData/test03.txt", inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

上传文件流

public class OssUploadFileStream {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        InputStream inputStream = null;
        try {
    
    
            inputStream = new FileInputStream("D:\\Java\\test.txt");
        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
        }

        // 依次填写Bucket名称、Object完整路径、。Object完整路径中不能包含Bucket名称。
        ossClient.putObject("java521", "testData/test04.txt", inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.2.1.2、文件上传

public class OssUploadFile {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
       String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";


        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 创建PutObjectRequest对象。
        // 依次填写Bucket名称、上传到oss的完整路径(包括路径和文件名)、本地文件的完整路径。
        // 如果未指定本地路径,则默认从程序所属项目对应本地路径中上传文件。
        PutObjectRequest putObjectRequest = new PutObjectRequest("java521", "testData/test05.txt", new File("D:\\Java\\test.txt"));

        // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
        //ObjectMetadata metadata = new ObjectMetadata();
        //metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        //metadata.setObjectAcl(CannedAccessControlList.Private);
        //putObjectRequest.setMetadata(metadata);

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.2.2、追加上传

追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。

使用限制

  • 如果文件不存在,则调用AppendObject接口会创建一个可追加类型的文件。
  • 如果文件已存在,且为可追加类型文件时,若设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。如果文件已存在,且为不可追加类型文件时,则抛出ObjectNotAppendable异常。
  • 追加类型的文件暂不支持CopyObject操作。
public class OssAppendUpload {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";

        String content1 = "Hello World \n";
        String content2 = "Hello OSS \n";
        String content3 = "Hello, Mr. Xu \n";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        ObjectMetadata meta = new ObjectMetadata();
        // 指定上传的内容类型。
        meta.setContentType("text/plain");

        // 通过AppendObjectRequest设置多个参数。
        AppendObjectRequest appendObjectRequest = new AppendObjectRequest("java521", "testData/test07.txt", new ByteArrayInputStream(content1.getBytes()), meta);

        // 通过AppendObjectRequest设置单个参数。
        // 设置Bucket名称。
        //appendObjectRequest.setBucketName("<yourBucketName>");
        // 设置Object名称。即不包含Bucket名称在内的Object的完整路径,例如example/test.txt。
        //appendObjectRequest.setKey("<yourObjectName>");
        // 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为InputStream类型。
        //appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
        // 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为File类型。
        //appendObjectRequest.setFile(new File("<yourLocalFile>"));
        // 指定文件的元信息,第一次追加时有效。
        //appendObjectRequest.setMetadata(meta);

        // 第一次追加。
        // 设置文件的追加位置。

        appendObjectRequest.setPosition(0L);
        AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
        // 文件的64位CRC值。此值根据ECMA-182标准计算得出。
        System.out.println(appendObjectResult.getObjectCRC());

        // 第二次追加。
        // nextPosition指明下一次请求中应当提供的Position,即文件当前的长度。
        appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
        appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
        appendObjectResult = ossClient.appendObject(appendObjectRequest);

        // 第三次追加。
        appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
        appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
        appendObjectResult = ossClient.appendObject(appendObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.2.3、断点续传上传

通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录点。上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。

参数
您可以通过ossClient.uploadFile方法实现断点续传上传。此方法的uploadFileRequest请求包含的参数请参见下表。

参数 描述
BucketName 存储空间名称。
Key 上传到OSS的文件名称。
UploadFile 待上传的本地文件路径。
TaskNum 上传并发线程数,默认值为1。
PartSize 上传的分片大小,单位为Byte,取值范围为100 KB~5 GB。默认值为100 KB。
EnableCheckpoint 是否开启断点续传功能,默认关闭。
CheckpointFile 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中,如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。上传完成后,该文件会被删除。如果未设置该值,默认与待上传的本地文件同路径,名称为${uploadFile}.ucp。
Callback 使用上传回调。关于上传回调的更多信息,请参见Callback上传回调
public class OssBreakpointUpload {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        ObjectMetadata meta = new ObjectMetadata();
        // 指定上传的内容类型。
        meta.setContentType("text/plain");

        // 文件上传时设置访问权限ACL。
        // meta.setObjectAcl(CannedAccessControlList.Private);

        // 通过UploadFileRequest设置多个参数。
        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
        UploadFileRequest uploadFileRequest = new UploadFileRequest("java521", "testData/test08.txt");

        // 通过UploadFileRequest设置单个参数。
        // 填写Bucket名称。
        //uploadFileRequest.setBucketName("examplebucket");
        // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
        //uploadFileRequest.setKey("exampleobject.txt");
        // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        uploadFileRequest.setUploadFile("D:\\Java\\test.txt");
        // 指定上传并发线程数,默认值为1。
        uploadFileRequest.setTaskNum(5);
        // 指定上传的分片大小。
        uploadFileRequest.setPartSize(1 * 1024 * 1024);
        // 开启断点续传,默认关闭。
        uploadFileRequest.setEnableCheckpoint(true);
        // 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中。
        uploadFileRequest.setCheckpointFile("yourCheckpointFile");
        // 文件的元数据。
        uploadFileRequest.setObjectMetadata(meta);
        // 设置上传成功回调,参数为Callback类型。
        //uploadFileRequest.setCallback("yourCallbackEvent");

        // 断点续传上传。
        try {
    
    
            ossClient.uploadFile(uploadFileRequest);
        } catch (Throwable throwable) {
    
    
            throwable.printStackTrace();
        }

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.2.4、进度条

进度条用于指示上传或下载文件的进度。本文以ossClient.putObject方法为例,介绍如何使用进度条。

public class PutObjectProgressListener implements ProgressListener {
    
    
    private long bytesWritten = 0;
    private long totalBytes = -1;
    private boolean succeed = false;

    @Override
    public void progressChanged(ProgressEvent progressEvent) {
    
    
        long bytes = progressEvent.getBytes();
        ProgressEventType eventType = progressEvent.getEventType();
        switch (eventType) {
    
    
            case TRANSFER_STARTED_EVENT:
                System.out.println("Start to upload......");
                break;
            case REQUEST_CONTENT_LENGTH_EVENT:
                this.totalBytes = bytes;
                System.out.println(this.totalBytes + " bytes in total will be uploaded to OSS");
                break;
            case REQUEST_BYTE_TRANSFER_EVENT:
                this.bytesWritten += bytes;
                if (this.totalBytes != -1) {
    
    
                    int percent = (int)(this.bytesWritten * 100.0 / this.totalBytes);
                    System.out.println(bytes + " bytes have been written at this time, upload progress: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
                } else {
    
    
                    System.out.println(bytes + " bytes have been written at this time, upload ratio: unknown" + "(" + this.bytesWritten + "/...)");
                }
                break;
            case TRANSFER_COMPLETED_EVENT:
                this.succeed = true;
                System.out.println("Succeed to upload, " + this.bytesWritten + " bytes have been transferred in total");
                break;
            case TRANSFER_FAILED_EVENT:
                System.out.println("Failed to upload, " + this.bytesWritten + " bytes have been transferred");
                break;
            default:
                break;
        }
    }

    public boolean isSucceed() {
    
    
        return succeed;
    }

    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
        String bucketName = "java521";
        String objectName = "testData/test09.zip";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
    
    
            // 上传文件的同时指定了进度条参数。
            ossClient.putObject(new PutObjectRequest(bucketName, objectName, new File("D:\\Java\\jdk1.8.0_162\\src.zip")).
                    <PutObjectRequest>withProgressListener(new PutObjectProgressListener()));

        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.2.5、上传回调

public class OssUploadCallBack {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
        String bucketName = "java521";
        String objectName = "testData/test10.txt";
        // 您的回调服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。
        String callbackUrl = "http://oss-demo.aliyuncs.com:23450";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        String content = "Hello OSS";
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));

        // 上传回调参数。
        Callback callback = new Callback();
        callback.setCallbackUrl(callbackUrl);
        //(可选)设置回调请求消息头中Host的值,即您的服务器配置Host的值。
        // callback.setCallbackHost("yourCallbackHost");
        // 设置发起回调时请求body的值。
        callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
        // 设置发起回调请求的Content-Type。
        callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
        // 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。
        callback.addCallbackVar("x:var1", "value1");
        callback.addCallbackVar("x:var2", "value2");
        putObjectRequest.setCallback(callback);

        PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);

        // 读取上传回调返回的消息内容。
        byte[] buffer = new byte[1024];
        try {
    
    
            putObjectResult.getResponse().getContent().read(buffer);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
        try {
    
    
            putObjectResult.getResponse().getContent().close();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

        // 关闭OSSClient。
        ossClient.shutdown();

    }
}

其它方式略

4.3、下载文件

4.3.1、流式下载

当下载的文件太大或者一次性下载耗时太长时,您可以通过流式下载,一次处理部分内容,直到完成文件的下载。

ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。关闭方法如下:

OSSObject ossObject = ossClient.getObject(bucketName, objectName);
ossObject.close();
public class OssStreamDownload {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
        // 填写Bucket名称。
        String bucketName = "java521";
        // 填写Object的完整路径。Object完整路径中不能包含Bucket名称。 文件必须在oss中在在
        String objectName = "testData/test10.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(bucketName, objectName);

        // 读取文件内容。
        System.out.println("Object content:");
        BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
        while (true) {
    
    
            String line = null;
            try {
    
    
                line = reader.readLine();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            if (line == null) break;

            System.out.println("\n" + line);
        }
        // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
        try {
    
    
            reader.close();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

        // 关闭OSSClient。
        ossClient.shutdown();

    }
}

4.3.2、下载到本地文件

public class OssDownloadLocal {
    
    
    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
        // 填写Bucket名称。
        String bucketName = "java521";
        // 填写Object的完整路径。Object完整路径中不能包含Bucket名称。 文件必须在oss中在在
        String objectName = "testData/test10.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
        // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("D:\\Java\\downloadFile.txt"));

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.3.3、进度条

进度条用于指示上传或下载文件的进度。本文以ossClient.getObject方法为例,介绍如何使用进度条。

public class GetObjectProgressListener implements ProgressListener {
    
    
    private long bytesRead = 0;
    private long totalBytes = -1;
    private boolean succeed = false;

    @Override
    public void progressChanged(ProgressEvent progressEvent) {
    
    
        long bytes = progressEvent.getBytes();
        ProgressEventType eventType = progressEvent.getEventType();
        switch (eventType) {
    
    
            case TRANSFER_STARTED_EVENT:
                System.out.println("Start to download......");
                break;
            case RESPONSE_CONTENT_LENGTH_EVENT:
                this.totalBytes = bytes;
                System.out.println(this.totalBytes + " bytes in total will be downloaded to a local file");
                break;
            case RESPONSE_BYTE_TRANSFER_EVENT:
                this.bytesRead += bytes;
                if (this.totalBytes != -1) {
    
    
                    int percent = (int) (this.bytesRead * 100.0 / this.totalBytes);
                    System.out.println(bytes + " bytes have been read at this time, download progress: " +
                            percent + "%(" + this.bytesRead + "/" + this.totalBytes + ")");
                } else {
    
    
                    System.out.println(bytes + " bytes have been read at this time, download ratio: unknown" +
                            "(" + this.bytesRead + "/...)");
                }
                break;
            case TRANSFER_COMPLETED_EVENT:
                this.succeed = true;
                System.out.println("Succeed to download, " + this.bytesRead + " bytes have been transferred in total");
                break;
            case TRANSFER_FAILED_EVENT:
                System.out.println("Failed to download, " + this.bytesRead + " bytes have been transferred");
                break;
            default:
                break;
        }
    }

    public boolean isSucceed() {
    
    
        return succeed;
    }


    public static void main(String[] args) {
    
    
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tKmStGAf3Qz********";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
        // 填写Bucket名称。
        String bucketName = "java521";
        // 填写Object的完整路径。Object完整路径中不能包含Bucket名称。 文件必须在oss中在在
        String objectName = "testData/test09.zip";
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
    
    
            // 下载文件的同时指定了进度条参数。
            ossClient.getObject(new GetObjectRequest(bucketName, objectName).
                            <GetObjectRequest>withProgressListener(new GetObjectProgressListener()),
                    new File("D:\\Java\\srcTest.zip"));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

其它方式略

猜你喜欢

转载自blog.csdn.net/qq_37242720/article/details/118938703