Spring Boot集成阿里云对象存储OSS

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Spring Boot集成阿里云对象存储OSS,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

对象存储OSS

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本

产品优势

1.更安全

完善的权限控制与多种加密算法的支持,满足企业数据安全与合规要求

2.更可靠

OSS的多重冗余架构设计,为数据持久存储提供更可靠的保障

3.更稳定

提供高达99.995%的可用性SLA承诺,为客户提供高可用的存储服务

4.更智能

提供数据的生命周期管理与数据的智能处理能力,有效满足企业需求

产品功能

1.数据迁移

支持PB级的在线、离线迁移方案,完成中国互联网首个单客户百PB级数据的迁移上云案例,提供更安全、更快速的海量数据迁移上云方案

2.数据处理

支持图片、文档、视频、CSV等数据的常用处理和分析能力,提供更智能的对象存储

3.数据管理

支持生命周期、镜像回源、更丰富的数据上传与下载方式、事件通知、回调等功能,提供更简单易用、更便于管理的对象存储

4.容灾备份

通过数据跨区域复制以及同城冗余、版本控制等技术,保障数据的高可靠性,防止数据被误删或误覆盖导致的业务损失

5.安全合规

OSS提供多种保证数据安全与合规的技术,包括防盗链、数据存储加密和数据的合规保留策略(WORM)设置等

应用场景

1.数据迁移

阿里云提供了多种数据迁移方式与存储类型,让数据能够快速、安全地迁移至对象存储OSS。与此同时,还提供丰富多样的数据存储类型以及数据管理功能,帮助客户降低存储成本,提高运维效率

2.数据湖

阿里云对象存储OSS打造了云原生的企业级数据湖,作为统一的存储池,不仅可对接多种数据输入方式,还可以存储任意规模的结构化、半结构化、非结构化数据

3.企业数据存储和管理

阿里云对象存储OSS提供多种数据存储类型,包括标准型、低频访问型、归档型以及冷归档型,并结合OSS生命周期管理能力,根据数据的冷热程度进行数据智能分层,提供最具性价比的对象存储服务

4.数据处理

阿里云对象存储OSS提供多种数据处理能力 ,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、Select查询等,通过简单的 RESTful 接口,可以在任何时间、任何地点、任何互联网设备上对存储在OSS中的数据进行分析处理

5.容灾与备份

阿里云对象存储OSS不仅提供多种冗余能力的存储类型(如同城冗余与本地冗余),同时在数据的跨区域容灾、防止数据误删除等场景下也提供了丰富的产品能力

环境准备

开通对象存储OSS服务

产品地址:https://www.aliyun.com/product/oss
在这里插入图片描述

创建Bucket

在这里插入图片描述
按需求选择相关配置参数
在这里插入图片描述

创建RAM子用户

地址:https://ram.console.aliyun.com/users/new
在这里插入图片描述
在这里插入图片描述

根据实际需求添加权限
在这里插入图片描述

Spring Boot集成阿里云对象存储OSS

开发文档参考:https://help.aliyun.com/document_detail/195870.html

引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.0</version>
</dependency>

配置application.properties

# oss配置
oss.accessKeyId=
oss.accessKeySecret=
oss.endpoint=http://oss-cn-chengdu.aliyuncs.com
oss.domain=http://cj-upload.oss-cn-chengdu.aliyuncs.com/
oss.bucket=cj-upload

参数配置对象

创建Oss参数配置对象,读取配置文件信息,封装到该对象

@Component
//@PropertySource("classpath:application.properties")
public class Oss implements InitializingBean {
    @Value("${oss.accessKeyId}")
    private String accessKeyId;
    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${oss.endpoint}")
    private String endpoint;
    @Value("${oss.bucket}")
    private String bucket;

    @Value("${oss.domain}")
    private String ossDomain;

    public static String ACCESSKEY_ID;
    public static String ACCESSKEY_SECRET;
    public static String ENDPOINT;
    public static String BUCKET;
    public static String OSSDOMAIN;

    @Override
    public void afterPropertiesSet() {
        ACCESSKEY_ID = accessKeyId;
        ACCESSKEY_SECRET = accessKeySecret;
        ENDPOINT = endpoint;
        BUCKET = bucket;
        OSSDOMAIN = ossDomain;
    }
}

初始化

OSSClient是OSS的Java客户端,用于管理存储空间和文件等OSS资源。使用Java SDK发起OSS请求,需要初始化一个OSSClient实例,并根据需要修改ClientConfiguration的默认配置项

public class AliyunOSSUtils {

    /**
     * 初始化
     * @return
     */
    public static OSS initOSS() {
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = Oss.ENDPOINT;
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = Oss.ACCESSKEY_ID;
        String accessKeySecret = Oss.ACCESSKEY_SECRET;

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

        return ossClient;
    }
}

简单上传

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

简单上传:包括流式上传和文件上传。最大不能超过5GB。
表单上传:最大不能超过5GB。
追加上传:最大不能超过5GB。
断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。
分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。
    /**
     * 简单上传-上传文件流
     */
    public static PutObjectResult uploadFile(String filePath, String newFielPath) {
        //指定存储空间(bucketName)
        String bucketName = Oss.BUCKET;
        //初始化
        OSS ossClient = AliyunOSSUtils.initOSS();

        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(filePath);
            //上传文件到指定的存储空间(bucketName)并将其保存为指定的文件名称(user.png)
            PutObjectResult putObjectResult = ossClient.putObject(bucketName, newFielPath, fileInputStream);
            return putObjectResult;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient
                ossClient.shutdown();
            }
        }
        return null;
    }
@Test
public  void uploadFile(){
   AliyunOSSUtils.uploadFile("D:\\user\\test.png", LocalDate.now()+"/user.png");
}

在这里插入图片描述

下载文件

OSS Java SDK提供丰富的文件下载方式:流式下载、下载到本地文件、范围下载、断点续传下载、限定条件下载

    /**
     * 下载到本地文件
     */
    public static ObjectMetadata downloadFile(String filePath) {
        //指定存储空间(bucketName)
        String bucketName = Oss.BUCKET;
        //初始化
        OSS ossClient = AliyunOSSUtils.initOSS();
        try {
            // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
            // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
            ObjectMetadata objectMetadata = ossClient.getObject(new GetObjectRequest(bucketName, filePath), new File("D:\\user.jpg"));
            return objectMetadata;
        } catch (ClientException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient
                ossClient.shutdown();
            }
        }
        return null;
    }
    @Test
    public  void downloadFile(){
        AliyunOSSUtils.downloadFile("2022-09-18/user.png");
    }

追加上传

准备test.txt文件

1.hello
2.world
3.ok

准备test2.txt文件

4.hello

5.world

6.ok
/**
     * 追加长传文件
     */
    public static AppendObjectResult appendUpload(String filePath, File file, long position) {
        // 创建ossClient实例
        OSS ossClient = AliyunOSSUtils.initOSS();
        try {
            ObjectMetadata meta = new ObjectMetadata();
            // 指定上传的内容类型
            meta.setContentType("text/plain");
            // 通过AppendObjectRequest设置多个参数。
            AppendObjectRequest appendObjectRequest = new AppendObjectRequest(Oss.BUCKET, filePath, file, meta);

            // 通过AppendObjectRequest设置单个参数。
            // 设置存储空间名称。
            //appendObjectRequest.setBucketName("<yourBucketName>");
            // 设置文件名称。
            //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(position);
            AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
            return appendObjectResult;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient
                ossClient.shutdown();
            }
        }
        return null;
    }
    @Test
    public void appendUpload() throws IOException {
        File file1=new File("D:\\test1.txt");
        File file2=new File("D:\\test2.txt");
        FileInputStream fileInputStream = new FileInputStream(file1);
        AppendObjectResult appendObjectResult = AliyunOSSUtils.appendUpload(LocalDate.now() + "/test.txt", file1, 0);
        Long nextPosition = appendObjectResult.getNextPosition();
        AliyunOSSUtils.appendUpload(LocalDate.now() + "/test.txt", file2, nextPosition);
    }

访问https://oss.console.aliyun.com/bucket/,下载文件查看
在这里插入图片描述

断点续传

    /**
     * 断点续传
     */
    public static UploadFileResult breakpointSequel(String filePath, String localFilePath) {
        // 创建ossClient实例
        OSS ossClient = AliyunOSSUtils.initOSS();
        try {
            ObjectMetadata meta = new ObjectMetadata();
            // 指定上传的内容类型。
            meta.setContentType("text/plain");
            // 文件上传时设置访问权限ACL。
            // meta.setObjectAcl(CannedAccessControlList.Private);

            // 通过UploadFileRequest设置多个参数。
            // 依次填写Bucket名称(例如examplebucket)以及Object完整路径(例如exampledir/exampleobject.txt),Object完整路径中不能包含Bucket名称。
            UploadFileRequest uploadFileRequest = new UploadFileRequest(Oss.BUCKET, filePath);

            // 通过UploadFileRequest设置单个参数。
            // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
            uploadFileRequest.setUploadFile(localFilePath);
            // 指定上传并发线程数,默认值为1。
            uploadFileRequest.setTaskNum(2);
            // 指定上传的分片大小,单位为字节,取值范围为100 KB~5 GB。默认值为100 KB。
//            uploadFileRequest.setPartSize(1 * 1024 * 1024);
            // 开启断点续传,默认关闭。
            uploadFileRequest.setEnableCheckpoint(true);
            // 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中,如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。上传完成后,该文件会被删除。
            // 如果未设置该值,默认与待上传的本地文件同路径,名称为${uploadFile}.ucp。
//            uploadFileRequest.setCheckpointFile("yourCheckpointFile");
            // 文件的元数据。
            uploadFileRequest.setObjectMetadata(meta);
            // 设置上传回调,参数为Callback类型。
            //uploadFileRequest.setCallback("yourCallbackEvent");

            // 断点续传上传。
            UploadFileResult uploadFileResult = ossClient.uploadFile(uploadFileRequest);
            return uploadFileResult;
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return null;
    }
   @Test
    public void breakpointSequel() {
        AliyunOSSUtils.breakpointSequel(LocalDate.now() + "/test.mp4","D:\\test.mp4");
    }

在测试上传过程中,中断上传,返回本地路径查看,发现生成后缀.ucp的进度信息记录文件
在这里插入图片描述

分片上传

/**
     * 分片上传
     */
    public static CompleteMultipartUploadResult partialUpload(String objectName, String localFilePath) {
        // 创建ossClient实例
        OSS ossClient = AliyunOSSUtils.initOSS();
        try {
            // 创建InitiateMultipartUploadRequest对象。
            InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(Oss.BUCKET, objectName);

            // 如果需要在初始化分片时设置请求头,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // 指定该Object的网页缓存行为。
            // metadata.setCacheControl("no-cache");
            // 指定该Object被下载时的名称。
            // metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
            // 指定该Object的内容编码格式。
            // metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
            // 指定初始化分片上传时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。
            // metadata.setHeader("x-oss-forbid-overwrite", "true");
            // 指定上传该Object的每个part时使用的服务器端加密方式。
            // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
            // 指定Object的加密算法。如果未指定此选项,表明Object使用AES256加密算法。
            // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
            // 指定KMS托管的用户主密钥。
            // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
            // 指定Object的存储类型。
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
            // 指定Object的对象标签,可同时设置多个标签。
            // metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
            // request.setObjectMetadata(metadata);

            // 初始化分片。
            InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
            // 返回uploadId,它是分片上传事件的唯一标识。您可以根据该uploadId发起相关的操作,例如取消分片上传、查询分片上传等。
            String uploadId = upresult.getUploadId();

            // partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。
            List<PartETag> partETags = new ArrayList<PartETag>();
            // 每个分片的大小,用于计算文件有多少个分片。单位为字节。
            final long partSize = 1 * 1024 * 1024L;   //1 MB。

            // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
            final File sampleFile = new File(localFilePath);
            long fileLength = sampleFile.length();
            int partCount = (int) (fileLength / partSize);
            if (fileLength % partSize != 0) {
                partCount++;
            }
            // 遍历分片上传。
            for (int i = 0; i < partCount; i++) {
                log.info("开始上传分片:{}", (i + 1));
                long startPos = i * partSize;
                long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
                InputStream instream = new FileInputStream(sampleFile);
                // 跳过已经上传的分片。
                instream.skip(startPos);
                UploadPartRequest uploadPartRequest = new UploadPartRequest();
                uploadPartRequest.setBucketName(Oss.BUCKET);
                uploadPartRequest.setKey(objectName);
                uploadPartRequest.setUploadId(uploadId);
                uploadPartRequest.setInputStream(instream);
                // 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100 KB。
                uploadPartRequest.setPartSize(curPartSize);
                // 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。
                uploadPartRequest.setPartNumber(i + 1);
                // 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
                UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
                // 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。
                partETags.add(uploadPartResult.getPartETag());
            }


            // 创建CompleteMultipartUploadRequest对象。
            // 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
            CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(Oss.BUCKET, objectName, uploadId, partETags);

            // 如果需要在完成分片上传的同时设置文件访问权限,请参考以下示例代码。
            // completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);
            // 指定是否列举当前UploadId已上传的所有Part。如果通过服务端List分片数据来合并完整文件时,以上CompleteMultipartUploadRequest中的partETags可为null。
            // Map<String, String> headers = new HashMap<String, String>();
            // 如果指定了x-oss-complete-all:yes,则OSS会列举当前UploadId已上传的所有Part,然后按照PartNumber的序号排序并执行CompleteMultipartUpload操作。
            // 如果指定了x-oss-complete-all:yes,则不允许继续指定body,否则报错。
            // headers.put("x-oss-complete-all","yes");
            // completeMultipartUploadRequest.setHeaders(headers);

            // 完成分片上传。
            CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            System.out.println(completeMultipartUploadResult.getETag());
            return completeMultipartUploadResult;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return null;
    }
    @Test
    public void partialUpload() {
        AliyunOSSUtils.partialUpload(LocalDate.now() + "/test.mp4","D:\\test.mp4");
    }
INFO 39640 --- [           main] com.example.demo.utils.AliyunOSSUtils    : 开始上传分片:1
INFO 39640 --- [           main] com.example.demo.utils.AliyunOSSUtils    : 开始上传分片:2
INFO 39640 --- [           main] com.example.demo.utils.AliyunOSSUtils    : 开始上传分片:3
67483CC314CF06A4879847F60C0059DA-3

文件管理

1.判断文件是否存在

// 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,如果为true则忽略302重定向或镜像;如果false,则考虑302重定向或镜像。
boolean found = ossClient.doesObjectExist("<yourBucketName>", "<yourObjectName>");

2.管理文件访问权限

文件的访问权限优先级高于存储空间的访问权限。文件的访问权限有以下四种

访问权限 描述 访问权限值
继承Bucket 文件遵循存储空间的访问权限。 CannedAccessControlList.Default
私有 文件的拥有者和授权用户有该文件的读写权限,其他用户没有权限操作该文件。 CannedAccessControlList.Private
公共读 文件的拥有者和授权用户有该文件的读写权限,其他用户只有文件的读权限。请谨慎使用该权限。 CannedAccessControlList.PublicRead
公共读写 所有用户都有该文件的读写权限。请谨慎使用该权限。 CannedAccessControlList.PublicReadWrite

设置文件访问权限

// 设置文件的访问权限为公共读。
ossClient.setObjectAcl("<yourBucketName>", "<yourObjectName>", CannedAccessControlList.PublicRead);

获取文件访问权限

// 获取文件的访问权限。
ObjectAcl objectAcl = ossClient.getObjectAcl("<yourBucketName>", "<yourObjectName>");
System.out.println(objectAcl.getPermission().toString());

3.删除文件

删除单个文件

// 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
ossClient.deleteObject(bucketName, objectName);

删除多个文件

每次最多删除1000个文件。有两种返回模式:

详细(verbose)模式:返回删除成功的文件列表。默认为详细模式。

简单(quiet)模式:返回删除失败的文件列表。

DeleteObjectsRequest的参数如下:

参数 描述 方法
Keys 需要删除的文件。 setKeys(List)
quiet 返回模式。true表示简单模式,false表示详细模式。默认为详细模式。 setQuiet(boolean)
encodingType 对返回的文件名称进行编码。编码类型目前仅支持url。 setEncodingType(String)
DeleteObjectsResult的参数如下:
参数 描述 方法
deletedObjects 删除结果。详细模式下为删除成功的文件列表,简单模式下为删除失败的文件列表。 List getDeletedObjects()
encodingType deletedObjects中文件名称的编码,为空表示没有编码。 getEncodingType()

// 删除文件。key等同于ObjectName,表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
List<String> keys = new ArrayList<String>();
keys.add("key0");
keys.add("key1");
keys.add("key2");

DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();

完整AliyunOSSUtils

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class AliyunOSSUtils {

    /**
     * 初始化
     *
     * @return
     */
    public static OSS initOSS() {
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = Oss.ENDPOINT;
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        String accessKeyId = Oss.ACCESSKEY_ID;
        String accessKeySecret = Oss.ACCESSKEY_SECRET;

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

        return ossClient;
    }


    /**
     * 文件上传
     *
     * @param filePath
     * @param newFielPath
     * @return
     */
    public static PutObjectResult uploadFile(String filePath, String newFielPath) {
        //指定存储空间(bucketName)
        String bucketName = Oss.BUCKET;
        //初始化
        OSS ossClient = AliyunOSSUtils.initOSS();

        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(filePath);
            //上传文件到指定的存储空间(bucketName)并将其保存为指定的文件名称(user.png)
            PutObjectResult putObjectResult = ossClient.putObject(bucketName, newFielPath, fileInputStream);
            return putObjectResult;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient
                ossClient.shutdown();
            }
        }
        return null;
    }


    /**
     * 下载到本地文件
     */
    public static ObjectMetadata downloadFile(String filePath) {
        //指定存储空间(bucketName)
        String bucketName = Oss.BUCKET;
        //初始化
        OSS ossClient = AliyunOSSUtils.initOSS();
        try {
            // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
            // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
            ObjectMetadata objectMetadata = ossClient.getObject(new GetObjectRequest(bucketName, filePath), new File("D:\\user.jpg"));
            return objectMetadata;
        } catch (ClientException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient
                ossClient.shutdown();
            }
        }
        return null;
    }

    /**
     * 追加长传文件
     */
    public static AppendObjectResult appendUpload(String filePath, File file, long position) {
        // 创建ossClient实例
        OSS ossClient = AliyunOSSUtils.initOSS();
        try {
            ObjectMetadata meta = new ObjectMetadata();
            // 指定上传的内容类型
            meta.setContentType("text/plain");
            // 通过AppendObjectRequest设置多个参数。
            AppendObjectRequest appendObjectRequest = new AppendObjectRequest(Oss.BUCKET, filePath, file, meta);

            // 通过AppendObjectRequest设置单个参数。
            // 设置存储空间名称。
            //appendObjectRequest.setBucketName("<yourBucketName>");
            // 设置文件名称。
            //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(position);
            AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
            return appendObjectResult;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient
                ossClient.shutdown();
            }
        }
        return null;
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136998.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!