SDK提供一系列接口方便用户管理Bucket下的所有文件。
列举所有文件
通过list
来列举当前Bucket下的所有文件。主要参数说明如下:
- prefix 只列出符合特定前缀的文件
- marker 只列出文件名大于marker之后的文件
- delimiter 用于获取文件的公共前缀
- max-keys 用于指定最多返回的文件个数
以下代码用于列举当前Bucket下的所有文件:
let OSS = require('ali-oss');
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function list () {
{
// 不带任何参数,默认最多返回1000个文件。
let result = await client.list();
console.log result);
// 根据nextMarker继续列出文件。
if (result.isTruncated) {
let result = await client.list({
marker: result.nextMarker
});
}
// 列举前缀为'my-'的文件。
let result = await client.list({
prefix: 'my-'
});
console.log(result);
// 列举前缀为'my-'且在'my-object'之后的文件。
let result = await client.list({
prefix: 'my-',
marker: 'my-object'
});
console.log(result);
} catch (e) {
console.log(e);
}
}
list();
判断文件是否存在
通过get接口判断文件是否存在:
client.get(object).then((result) => {
if (result.res.status == 200) {
return true
}
}).catch((e)=> {
if (e.code == 'NoSuchKey') {
return false
}
})
说明
get接口的更多应用,请参见下载文件。
模拟目录结构
OSS是基于对象的存储服务,没有目录的概念。存储在一个Bucket中所有文件都是通过文件的key唯一标识,并没有层级的结构。这种结构可以让OSS的存储非常高效,但是用户管理文件时希望能够像传统的文件系统一样把文件分门别类放到 不同的“目录”下面。通过OSS提供的“公共前缀”的功能,也可以很方便地模拟目录结构。公共前缀的概念请参见列举Object。
假设Bucket中已有如下文件:
foo/x
foo/y
foo/bar/a
foo/bar/b
foo/hello/C/1
foo/hello/C/2
...
foo/hello/C/9999
接下来我们调用函数listDir来列举指定目录下的文件和子目录:
let OSS = require('ali-oss');
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function listDir(dir)
let result = await client.list({
prefix: dir,
delimiter: '/'
});
result.prefixes.forEach(function (subDir) {
console.log('SubDir: %s', subDir);
});
result.objects.forEach(function (obj) {
==> console.log('Object: %s', obj.name);
});
end
运行结果如下:
> await listDir('foo/')
=> SubDir: foo/bar/
SubDir: foo/hello/
Object: foo/x
Object: foo/y
> await listDir('foo/bar/')
=> Object: foo/bar/a
Object: foo/bar/b
> await listDir('foo/hello/C/')
=> Object: foo/hello/C/1
Object: foo/hello/C/2
...
Object: foo/hello/C/9999
文件元信息
向OSS上传文件时,除了文件内容,还可以指定文件的一些属性信息,称为“元信息”。 这些信息在上传时与文件一起存储,在下载时与文件一起返回。
文件元信息在上传、下载时均附在HTTP Headers中, 且HTTP协议规定不能包含复杂字符。
说明 元信息只能是简单的ASCII可见字符,不能包含换行。 所有元信息的总大小不能超过8KB。
使用put
,putStream
和multipartUpload
时,都可以通过指定meta参数来指定文件的元信息:
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', {
meta: {
year: 2016,
people: 'mary'
}
});
console.log(result);
} catch (e) {
console.log(e);
}
}
put();
通过putMeta接口来更新文件元信息:
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function putMeta () {
try {
let result = await client.putMeta('object-name', {
meta: {
year: 2015,
people: 'mary'
}
});
console.log(result);
} catch (e) {
console.log(e);
}
}
putMeta();
拷贝文件
使用copy
拷贝文件,拷贝分两种情况:
- 同一个Bucket
- 同一个region下的两个不同Bucket,此时源Object名字应为'/bucket/object'的形式
另外,拷贝时对文件元信息的处理有两种选择:
- 如果没有指定meta参数,则与源文件相同,即拷贝源文件的元信息。
- 如果指定了meta参数,则使用新的元信息覆盖源文件的信息。
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function copy () {
try {
// 两个Bucket之间拷贝
let result = await client.copy('to', '/from-bucket/from');
console.log(result);
// 拷贝元信息
let result = await client.copy('to', 'from');
console.log(result);
// 覆盖元信息
let result = await client.copy('to', 'from', {
meta: {
year: 2015,
people: 'mary'
}
});
console.log(result);
} catch (e) {
console.log(e);
}
}
删除文件
通过delete
来删除某个文件:
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function delete () {
try {
let result = yield client.delete('object-name');
console.log(result);
} catch (e) {
console.log(e);
}
}
delete();
批量删除文件
通过deleteMulti
来删除一批文件,并通过quiet参数来指定是否返回删除的结果:
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function deleteMulti () {
try {
let result = await client.deleteMulti(['obj-1', 'obj-2', 'obj-3']);
console.log(result);
let result = await client.deleteMulti(['obj-1', 'obj-2', 'obj-3'], {
quiet: true
});
console.log(result);
} catch (e) {
console.log(e);
}
}
deleteMulti();
在文档使用中是否遇到以下问题
更多建议
匿名提交