对象存储OSS

该功能的实现使用了阿里的:对象存储OSS技术。

在阿里对象存储空间的文件可以 以链接 的形式进行访问:

文件访问路径规则https://BucketName.Endpoint/ObjectName

rn useState 怎么存储对象_开发语言

该技术的使用方式有很多,针对于SDK的简单实现官网上也有教程,但是你会发现,实际的代码与官网给的示例代码有些出处,一般包含以下几个功能:

  • 创建存储空间:Bucket
  • 上传文件
  • 下载文件
  • 列举文件
  • 删除文件

有四个重要的名词:endpointbucketNameaccessKeyIdaccessKeySecret

  • endpoint:访问域名
  • bucketName:储存空间名
  • accessKeyId:密钥
  • accessKeySecret:密钥密码,阿里已经关闭了后于查询密钥密码的功能,所以在创建密钥时生成的密码要保存,丢了就没了。

接下来介绍上述功能的实际应用:
去官网上看以下这些示例代码,你会发现有很多地方使一样的,只有在 实现某一工功能 的地方不一样。

创建储存空间 :官网上将这一步骤给单独提了出来,目的是为了 使用代码 来创建Bucket,其实这一步我们完全可以手动来创建。进出官网,开通 对象储存OSS 功能,创建储存空间并起 名称(bucketName)。

完成之后后续四个功能的代码中 创建OSSClient示例就可以改为:

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

//指定了域名,密钥,密钥密码。

上传文件
这是最常用的功能,主要实现是 使用OSS对象调用putObject()方法

putObject(BucketName,ObjectName,ByteArrayInputStream),
new ByteArrayInputStream(byte[] byte),byte是对象数据的字节数组。

代码示例:

package com.sky.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

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

        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

下载文件
主要是使用 OSS 调用 getObject(bucketName, objectName);返回OSSClient实例
再用 OSSClient 实例调用getObjectContent();获取文件输入流

try代码块中的内容示例

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

try {
// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元数据。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream content = ossObject.getObjectContent();
if (content != null) {
	BufferedReader reader = new BufferedReader(new InputStreamReader(content));
	while (true) {
		String line = reader.readLine();
		if (line == null) {
	 		break;
		}
		System.out.println("\n" + line);
	}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
content.close();
}

其他地方不需改动

列举文件:
使用 OSS 调用listObjects(bucketName);

try代码块中的内容示例:

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

try {
	// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
	ObjectListing objectListing = ossClient.listObjects(bucketName);
	// objectListing.getObjectSummaries获取所有文件的描述信息。
	for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
		System.out.println(" - " + objectSummary.getKey() + "  " +
		 	"(size = " + objectSummary.getSize() + ")");
}

其他代码不需改动

删除文件:
使用 OSS 调用 deleteObject(bucketName, objectName);

try代码块中的内容示例:

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

try {
	// 删除文件。
	ossClient.deleteObject(bucketName, objectName);
}

其他代码不需改动

以链接访问对象储存中的对象:
文件访问路径规则https://BucketName.Endpoint/ObjectName上传文件 的示例代码中已有了该内用的示例代码,我们一般是将可给用户展示的文件的访问路径以字符串的形式发送给前端页面,让前端去访问该路径。