开发者社区 问答 正文

JavaScript-SDK之如何实现管理文件(一)?

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

查看所有文件


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

  • prefix 指定只列出符合特定前缀的文件
  • marker 指定只列出文件名大于marker之后的文件
  • delimiter 用于获取文件的公共前缀
  • max-keys 用于指定最多返回的文件个数var co = require('co');
  • var OSS = require('ali-oss');
  • var client = new OSS({
  •   region: '<Your region>',
  •   accessKeyId: '<Your AccessKeyId>',
  •   accessKeySecret: '<Your AccessKeySecret>',
  •   bucket: 'Your bucket name'
  • });
  • co(function* () {
  •   // 不带任何参数,默认最多返回1000个文件
  •   var result = yield client.list();
  •   console.log(result);
  •   // 根据nextMarker继续列出文件
  •   if (result.isTruncated) {
  •     var result = yield client.list({
  •       marker: result.nextMarker
  •     });
  •   }
  •   // 列出前缀为'my-'的文件
  •   var result = yield client.list({
  •     prefix: 'my-'
  •   });
  •   console.log(result);
  •   // 列出前缀为'my-'且在'my-object'之后的文件
  •   var result = yield client.list({
  •     prefix: 'my-',
  •     marker: 'my-object'
  •   });
  •   console.log(result);
  • }).catch(function (err) {
  •   console.log(err);
  • });



模拟目录结构


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,列出指定目录下的文件和子目录: var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
function* listDir(dir)
  var result = yield 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


运行结果如下: > yield listDir('foo/')
=> SubDir: foo/bar/
   SubDir: foo/hello/
   Object: foo/x
   Object: foo/y
> yield listDir('foo/bar/')
=> Object: foo/bar/a
   Object: foo/bar/b
> yield listDir('foo/hello/C/')
=> Object: foo/hello/C/1
   Object: foo/hello/C/2
   ...
   Object: foo/hello/C/9999



文件元信息


向OSS上传文件时,除了文件内容,还可以指定文件的一些属性信息,称为“元信息”。这些信息在上传时与文件一起存储,在下载时与文件一起返回。
因为文件元信息在上传/下载时是附在HTTP Headers中, HTTP协议规定不能包含复杂字符。因此元信息[backcolor=transparent]只能是简单的ASCII可见字符,不能包含换行。 所有元信息的总大小不能超过8KB。
使用put,putStream和multipartUpload时都可以通过指定meta参数来指定文件的元信息: var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var result = yield client.put('object-key', 'local-file', {
    meta: {
      year: 2016,
      people: 'mary'
    }
  });
  console.log(result);
}).catch(function (err) {
  console.log(err);
});


通过putMeta接口来更新文件元信息: var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var result = yield client.putMeta('object-key', {
    meta: {
      year: 2015,
      people: 'mary'
    }
  });
  console.log(result);
}).catch(function (err) {
  console.log(err);
});







展开
收起
青衫无名 2017-10-19 09:41:00 1570 分享 版权
0 条回答
写回答
取消 提交回答