本文介绍如何在开启版本控制状态下列举存储空间下(Bucket)的所有文件(Object)、指定个数的文件、指定前缀的文件等。
列举Bucket中所有Object的信息
以下代码用于列举指定Bucket中包括删除标记(Delete Marker)在内的所有Object的版本信息:
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填写存储空间名称。
bucket: 'yourbucketname'
});
// 列举包括删除标记在内的所有Object的版本信息。
async function getObjectVersions() {
let nextKeyMarker = null;
let nextVersionMarker = null;
let versionListing = null;
do {
versionListing = await client.getBucketVersions({
keyMarker: nextKeyMarker,
versionIdMarker: nextVersionMarker,
});
versionListing.objects.forEach((o) => {
console.log(`${o.name}, ${o.versionId}`);
});
versionListing.deleteMarker.forEach((o) => {
console.log(`${o.name}, ${o.versionId}`);
});
nextKeyMarker = versionListing.NextKeyMarker;
nextVersionMarker = versionListing.NextVersionIdMarker;
} while (versionListing.isTruncated);
}
getObjectVersions();
列举指定前缀Object的版本信息
以下代码用于列举指定前缀Object的版本信息:
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填写存储空间名称。
bucket: 'yourbucketname'
});
// 指定列举以"test-"为前缀的Object的版本信息。
async function getObjectVersionsByPrefix() {
let nextKeyMarker = null;
let nextVersionMarker = null;
let versionListing = null;
const prefix = 'test-'
do {
versionListing = await client.getBucketVersions({
keyMarker: nextKeyMarker,
versionIdMarker: nextVersionMarker,
prefix
})
versionListing.objects.forEach(o => {
console.log(`${o.name}, ${o.versionId}`)
})
versionListing.deleteMarker.forEach(o => {
console.log(`${o.name}, ${o.versionId}`)
})
nextKeyMarker = versionListing.NextKeyMarker;
nextVersionMarker = versionListing.NextVersionIdMarker;
} while (versionListing.isTruncated);
}
getObjectVersionsByPrefix();
列举指定个数Object的版本信息
以下代码用于列举指定个数Object的版本信息:
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填写存储空间名称。
bucket: 'yourbucketname'
});
async function getObjectVersionByNumber() {
// 指定最多列举100个Object的版本信息。
const versionListing = await client.getBucketVersions({
"max-keys": 100,
});
// 获取Object的版本信息。在未开启版本控制的情况下,VersionId为none。
versionListing.objects.forEach((o) => {
console.log(`${o.name}, ${o.versionId}`);
});
versionListing.deleteMarker.forEach((o) => {
console.log(`${o.name}, ${o.versionId}`);
});
}
getObjectVersionByNumber();
文件夹功能
OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。
通过delimiter和prefix两个参数可以模拟文件夹功能:
如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为Object。
如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。
假设存储空间中包含oss.jpg、fun/test.jpg、fun/movie/001.avi和fun/movie/007.avi4个文件,正斜线(/)作为文件夹的分隔符。以下示例说明了如何通过模拟文件夹的方式列举文件。
列举根目录下的Object的版本信息
以下代码用于列举根目录下的Object的版本信息:
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填写存储空间名称。
bucket: 'yourbucketname'
});
// 指定delimiter参数为正斜线(/),将会列举根目录下的Object的版本信息以及文件夹名称。
async function getRootObjectVersions() {
let nextKeyMarker = null;
let nextVersionMarker = null;
let versionListing = null;
do {
versionListing = await client.getBucketVersions({
keyMarker: nextKeyMarker,
versionIdMarker: nextVersionMarker,
delimiter: "/",
});
nextKeyMarker = versionListing.NextKeyMarker;
nextVersionMarker = versionListing.NextVersionIdMarker;
console.log(versionListing);
} while (versionListing.isTruncated);
}
getRootObjectVersions();
列举目录下的文件和子目录
以下代码用于列举指定目录下的文件和子目录:
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填写存储空间名称。
bucket: 'yourbucketname'
});
// 设置prefix参数来获取fun目录下的所有文件与文件夹,同时设置delimiter参数为正斜线(/)作为文件夹的分隔符。
async function getObjectVersionsByPrefixAndDirectory() {
let nextKeyMarker = null;
let nextVersionMarker = null;
let versionListing = null;
let prefix = "foo/";
do {
versionListing = await client.getBucketVersions({
keyMarker: nextKeyMarker,
versionIdMarker: nextVersionMarker,
prefix,
delimiter: "/",
});
nextKeyMarker = versionListing.NextKeyMarker;
nextVersionMarker = versionListing.NextVersionIdMarker;
console.log(versionListing);
} while (versionListing.isTruncated);
}
getObjectVersionsByPrefixAndDirectory();
相关文档
关于列举文件的API接口说明,请参见ListObjectVersions(GetBucketVersions)。