全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
对象存储 OSS

管理文件

更新时间:2017-06-07 13:26:11

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

查看所有文件

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

  • prefix 指定只列出符合特定前缀的文件
  • marker 指定只列出文件名大于marker之后的文件
  • delimiter 用于获取文件的公共前缀
  • max-keys 用于指定最多返回的文件个数
  1. var co = require('co');
  2. var OSS = require('ali-oss');
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. co(function* () {
  10. // 不带任何参数,默认最多返回1000个文件
  11. var result = yield client.list();
  12. console.log(result);
  13. // 根据nextMarker继续列出文件
  14. if (result.isTruncated) {
  15. var result = yield client.list({
  16. marker: result.nextMarker
  17. });
  18. }
  19. // 列出前缀为'my-'的文件
  20. var result = yield client.list({
  21. prefix: 'my-'
  22. });
  23. console.log(result);
  24. // 列出前缀为'my-'且在'my-object'之后的文件
  25. var result = yield client.list({
  26. prefix: 'my-',
  27. marker: 'my-object'
  28. });
  29. console.log(result);
  30. }).catch(function (err) {
  31. console.log(err);
  32. });

模拟目录结构

OSS是基于对象的存储服务,没有目录的概念。存储在一个Bucket中所有文件都是通过文件的key唯一标识,并没有层级的结构。这种结构可以让OSS的存储非常高效,但是用户管理文件时希望能够像传统的文件系统一样把文件分门别类放到不同的“目录”下面。通过OSS提供的“公共前缀”的功能,也可以很方便地模拟目录结构。公共前缀的概念请参考 列出Object

假设Bucket中已有如下文件:

  1. foo/x
  2. foo/y
  3. foo/bar/a
  4. foo/bar/b
  5. foo/hello/C/1
  6. foo/hello/C/2
  7. ...
  8. foo/hello/C/9999

接下来我们实现一个函数叫listDir,列出指定目录下的文件和子目录:

  1. var co = require('co');
  2. var OSS = require('ali-oss');
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. function* listDir(dir)
  10. var result = yield client.list({
  11. prefix: dir,
  12. delimiter: '/'
  13. });
  14. result.prefixes.forEach(function (subDir) {
  15. console.log('SubDir: %s', subDir);
  16. });
  17. result.objects.forEach(function (obj) {
  18. console.log(Object: %s', obj.name);
  19. });
  20. end

运行结果如下:

  1. > yield listDir('foo/')
  2. => SubDir: foo/bar/
  3. SubDir: foo/hello/
  4. Object: foo/x
  5. Object: foo/y
  6. > yield listDir('foo/bar/')
  7. => Object: foo/bar/a
  8. Object: foo/bar/b
  9. > yield listDir('foo/hello/C/')
  10. => Object: foo/hello/C/1
  11. Object: foo/hello/C/2
  12. ...
  13. Object: foo/hello/C/9999

文件元信息

向OSS上传文件时,除了文件内容,还可以指定文件的一些属性信息,称为“元信息”。这些信息在上传时与文件一起存储,在下载时与文件一起返回。

因为文件元信息在上传/下载时是附在HTTP Headers中, HTTP协议规定不能包含复杂字符。因此元信息只能是简单的ASCII可见字符,不能包含换行。 所有元信息的总大小不能超过8KB。

使用putputStreammultipartUpload时都可以通过指定meta参数来指定文件的元信息:

  1. var co = require('co');
  2. var OSS = require('ali-oss')
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. co(function* () {
  10. var result = yield client.put('object-key', 'local-file', {
  11. meta: {
  12. year: 2016,
  13. people: 'mary'
  14. }
  15. });
  16. console.log(result);
  17. }).catch(function (err) {
  18. console.log(err);
  19. });

通过putMeta接口来更新文件元信息:

  1. var co = require('co');
  2. var OSS = require('ali-oss')
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. co(function* () {
  10. var result = yield client.putMeta('object-key', {
  11. meta: {
  12. year: 2015,
  13. people: 'mary'
  14. }
  15. });
  16. console.log(result);
  17. }).catch(function (err) {
  18. console.log(err);
  19. });

拷贝文件

使用copy拷贝一个文件。拷贝可以发生在下面两种情况:

  • 同一个Bucket
  • 两个不同Bucket,但是它们在同一个region,此时的源Object名字应为’/bucket/object’的形式

另外,拷贝时对文件元信息的处理有两种选择:

  • 如果没有指定meta参数,则与源文件相同,即拷贝源文件的元信息
  • 如果指定了meta参数,则使用新的元信息覆盖源文件的信息
  1. var co = require('co');
  2. var OSS = require('ali-oss')
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. co(function* () {
  10. // 两个Bucket之间拷贝
  11. var result = yield client.copy('to', '/from-bucket/from');
  12. console.log(result);
  13. // 拷贝元信息
  14. var result = yield client.copy('to', 'from');
  15. console.log(result);
  16. // 覆盖元信息
  17. var result = yield client.copy('to', 'from', {
  18. meta: {
  19. year: 2015,
  20. people: 'mary'
  21. }
  22. });
  23. console.log(result);
  24. }).catch(function (err) {
  25. console.log(err);
  26. });

删除文件

通过delete来删除某个文件:

  1. var co = require('co');
  2. var OSS = require('ali-oss')
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. co(function* () {
  10. var result = yield client.delete('object-key');
  11. console.log(result);
  12. }).catch(function (err) {
  13. console.log(err);
  14. });

批量删除文件

通过deleteMulti来删除一批文件,用户可以通过quiet参数来指定是否返回删除的结果:

  1. var co = require('co');
  2. var OSS = require('ali-oss')
  3. var client = new OSS({
  4. region: '<Your region>',
  5. accessKeyId: '<Your AccessKeyId>',
  6. accessKeySecret: '<Your AccessKeySecret>',
  7. bucket: 'Your bucket name'
  8. });
  9. co(function* () {
  10. var result = yield client.deleteMulti(['obj-1', 'obj-2', 'obj-3']);
  11. console.log(result);
  12. var result = yield client.deleteMulti(['obj-1', 'obj-2', 'obj-3'], {
  13. quiet: true
  14. });
  15. console.log(result);
  16. }).catch(function (err) {
  17. console.log(err);
  18. });
本文导读目录