OSS Browser.js SDK提供一系列的接口方便您管理存储空间(Bucket)下文件(Object),例如列举Bucket下的所有文件、删除文件等。

列举所有文件

通过list函数列举当前Bucket下的所有文件:

let OSS = require('ali-oss');

let client = new OSS({
  // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: '<Your region>',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
 // 填写Bucket名称。
  bucket: '<Your bucket name>',
});

async function list (dir) {
  try {
    // 默认最多返回1000个文件。
    let result = await client.list();
    console.log(result);
    
    // 从上一次list操作读取的最后一个文件的下一个文件开始继续获取文件列表。
    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没有文件夹的概念,所有元素都是以Object来存储。创建文件夹本质上是创建一个文件名以正斜线(/)结尾,大小为0 KB的Object。这个Object可以被上传和下载,只是控制台会对以正斜线(/)结尾的Object以文件夹的方式展示。您可以通过Delimiter和Prefix参数模拟文件夹功能:

  • 如果把Prefix设为某个文件夹名,就可以列举以此Prefix开头的文件,即该文件夹下递归的所有的文件和子文件夹(目录)。
  • 如果再把Delimiter设置为正斜线(/)时,返回值就只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件名(目录)返回在SubDir部分,子文件夹下递归的文件和文件夹不被显示。

假设某个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({
  // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: '<Your region>',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  // 填写Bucket名称。
  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可见字符且不能包含换行,且所有元信息的总大小不能超过8 KB。

使用putmultipartUpload方法时都支持通过meta参数指定文件元信息。

  • put方法
    let OSS = require('ali-oss')
    
    let client = new OSS({
      // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
      region: '<Your region>',
      // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>',
      // 填写Bucket名称。
      bucket: '<Your bucket name>',
    });
    
    async function putWithMeta () {
      try {
        // object-key填写Object名称。Object名称为不包含Bucket名称在内的Object的完整路径,例如exampledir/exampleobject.txt。
        // local-file填写本地文件的完整路径。例如D:\\localpath\\examplefile.txt。
        let result = await client.put('object-key', 'local-file', { 
        // 指定文件元信息。
        meta: {
           year: 2020,
           month: 'Oct'
         }
       });
        console.log(result);
      } catch (e) {
        console.log(e);
      }
    }
    
    putWithMeta();            
  • multipartUpload方法
    let OSS = require('ali-oss')
    
    let client = new OSS({
      // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
      region: '<Your region>',
      // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>',
      // 填写Bucket名称。
      bucket: '<Your bucket name>',
    });
    
    async function multipartUploadWithMeta () {
      try {
        // object-key填写Object名称。Object名称为不包含Bucket名称在内的Object的完整路径,例如exampledir/exampleobject.txt。
        // local-file填写本地文件的完整路径。例如D:\\localpath\\examplefile.txt。
        let result = await client.multipartUpload('object-key', 'local-file', { 
        // 指定文件元信息。
        meta: {
           year: 2021,
           month: 'Nov'
         }
       });
        console.log(result);
      } catch (e) {
        console.log(e);
      }
    }
    
    multipartUploadWithMeta();
                

删除单个文件

通过delete方法删除单个文件:

let OSS = require('ali-oss')
let client = new OSS({
  // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
  region: '<Your region>',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  // 填写Bucket名称。
  bucket: '<Your bucket name>',
});

async function delete () {
  try {
    // 指定待删除的Object的名称。Object名称需填写不包含Bucket名称在内的Object的完整路径,例如exampledir/exampleobject.txt。
    let result = await client.delete('object-key');
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

delete();
            

删除多个文件

通过deleteMulti方法删除多个文件:

let OSS = require('ali-oss')

let client = new OSS({
  // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
  region: '<Your region>',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  // 填写Bucket名称。
  bucket: '<Your bucket name>',
});

async function deleteMulti () {
  try {
    // 指定多个待删除Object的名称。Object名称需填写不包含Bucket名称在内的Object的完整路径。
    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参数指定是否返回所有删除的文件列表。当quiet指定为true时,表示返回所有删除的文件列表。当quiet指定为false时,表示只返回删除失败的文件列表。
    quiet: true
  });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

deleteMulti();