版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
详细解答可以参考官方帮助文档
一个Bucket下可能有非常多的文件,SDK提供一系列的接口方便用户管理文件。
通过list来列出当前Bucket下的所有文件。主要的参数如下:
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 () {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/xfoo/yfoo/bar/afoo/bar/bfoo/hello/C/1foo/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)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);});end
运行结果如下:
> await listDir('foo/')=> SubDir: foo/bar/SubDir: foo/hello/Object: foo/xObject: foo/y> await listDir('foo/bar/')=> Object: foo/bar/aObject: foo/bar/b> await listDir('foo/hello/C/')=> Object: foo/hello/C/1Object: foo/hello/C/2...Object: foo/hello/C/9999
向OSS上传文件时,除了文件内容,还可以指定文件的一些属性信息,称为“元信息”。这些信息在上传时与文件一起存储,在下载时与文件一起返回。
因为文件元信息在上传/下载时是附在HTTP Headers中, HTTP协议规定不能包含复杂字符。因此元信息只能是简单的ASCII可见字符,不能包含换行。 所有元信息的总大小不能超过8KB。
使用put,putStream和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 put () {try {let result = await client.put('object-key', 'local-file', {meta: {year: 2016,people: 'mary'}});console.log(result);} catch (e) {console.log(e);}}put();
通过putMeta接口来更新文件元信息:
let OSS = require('ali-oss')let client = new OSS({region: '<Your region>',accessKeyId: '<Your AccessKeyId>',accessKeySecret: '<Your AccessKeySecret>',bucket: 'Your bucket name'});async function putMeta () {try {let result = await client.putMeta('object-key', {meta: {year: 2015,people: 'mary'}});console.log(result);} catch (e) {console.log(e);}}putMeta();
使用copy拷贝一个文件。拷贝可以发生在下面两种情况:
另外,拷贝时对文件元信息的处理有两种选择:
meta参数,则与源文件相同,即拷贝源文件的元信息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 copy () {try {// 两个Bucket之间拷贝let result = await client.copy('to', '/from-bucket/from');console.log(result);// 拷贝元信息let result = await client.copy('to', 'from');console.log(result);// 覆盖元信息let result = await client.copy('to', 'from', {meta: {year: 2015,people: 'mary'}});console.log(result);} catch (e) {console.log(e);}}
通过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 = yield 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();