一、OSS简介
最近在做毕设设计时,需要存储照片和消息提示信息。为了节约时间,并没有自己设计专用的文件存储系统,最后使用了阿里云的对象存储OSS来存储照片和消息提示信息。
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.999999999%,服务设计可用性不低于 99.99%。具有与平台无关的 RESTful API 接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
摘自-阿里云对象存储 OSS介绍
本文主要介绍在React下使用OSS上传、展示图片,Java后端列举指定前缀的OSS存储文件。
本文只讲解核心部分,对于不同SDK的OSS具体用法本文不作详细介绍,其具体用法请阅读官方文档:OSS-SKD示例。
使用OSS前需要进行跨域设置,在基础设置>跨域设置>创建规则下,进行如下设置:
二、React显示OSS图片
1. 引入依赖
使用npm命令引入ali-oss依赖。
npm install ali-oss --save
2. 上传图片
主要代码如下:
import OSS from 'ali-oss';
... ...
const client = new OSS({
accessKeyId: ' ',
accessKeySecret: ' ',
bucket: '',
region: 'oss-cn-beijing',
});
const key = 'key';
client.put(key, file);
参考官文文档-Node.js上传本地文件示例:
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: '<Your bucket name>',
});
async function put () {
try {
let result = await client.put('object-name', 'local-file');
console.log(result);
} catch (e) {
console.log(e);
}
}
put();
3. 显示图片
将图片下载到本地并显示比较浪费内存,本文采用为OSS文件添加公共读权限,使用<img src="">标签,设置src属性值直接显示图片。
- 如果设置了Object的权限(非default),则访问该Object时进行权限认证时 会优先判断Object的权限,而Bucket的权限设置会被忽略。
- 允许匿名访问时(设置了public-read或者public-read-write权限),用户可以直接通过浏览器访问,例如:
http://bucket-name.oss-cn-beijing.aliyuncs.com/pic.jpg
主要代码如下所示:
import OSS from 'ali-oss';
... ...
const client = new OSS({
accessKeyId: ' ',
accessKeySecret: ' ',
bucket: ' ',
region: ' ',
});
const key = 'key';
//给文件追加公共读权限
client.putACL(key, 'public-read');
const url = 'http://microservice-img-store.oss-cn-beijing.aliyuncs.com/' + key;
... ...
//设置src属性为url
<img className="img" key={Math.random()} src={url} />
三、列举指定前缀的OSS存储文件
本小节使用Java做为后端语言,列举指定前缀的OSS存储文件。
1. 引入依赖
在 pom.xml 文件中引入aliyun-sdk-oss依赖。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
2. 核心代码
列举包含指定前缀(prefix)的文件,主要代码如下所示:
来源于官方演示代码:[对象存储 OSS]>[SDK 示例]>[Java]> [管理文件]>列举文件
//import省略
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 指定前缀。
final String keyPrefix = "<yourkeyPrefix>";
// 列举包含指定前缀的文件。默认列举100个文件。
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withPrefix(keyPrefix));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
// 关闭OSSClient。
ossClient.shutdown();
上述代码可以列举包含指定前缀(prefix)的文件Object值,搭配流式下载可以获取文件内容,流式下载主要代码如下所示:
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 读取文件内容。
System.out.println("Object content:");
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
reader.close();
// 关闭OSSClient。
ossClient.shutdown();
未完待续