一个Bucket下可能有非常多的文件,SDK提供一系列的接口方便用户管理文件。

查看所有文件

通过list来列出当前Bucket下的所有文件。主要的参数如下:

  • prefix 指定只列出符合特定前缀的文件
  • marker 指定只列出文件名大于marker之后的文件
  • delimiter 用于获取文件的公共前缀
  • max-keys 用于指定最多返回的文件个数
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 (dir) {
  try {
    // 不带任何参数,默认最多返回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();

模拟目录结构

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) {
   try {
     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);
   });
  } catch (e) {
    console.log(e);
  }
}

运行结果如下:

> listDir('foo/')
=> SubDir: foo/bar/
   SubDir: foo/hello/
   Object: foo/x
   Object: foo/y

> listDir('foo/bar/')
=> Object: foo/bar/a
   Object: foo/bar/b

> 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,和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 multipartUploadWithMeta () {
  try {
    let result = await client.multipartUpload('object-key', 'local-file', { 
	meta: {
	   year: 2017,
	   people: 'mary'
     }
   });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

multipartUploadWithMeta();

删除文件

通过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 = await client.delete('object-key');
	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();