全部產品
Search
文件中心

Object Storage Service:管理檔案

更新時間:Aug 30, 2018

一個Bucket下可能有非常多的檔案,SDK提供一系列的介面方便使用者管理檔案。

查看所有檔案

通過list來列出當前Bucket下的所有檔案。主要的參數如下:

  • prefix 指定只列出符合特定首碼的檔案
  • marker 指定只列出檔案名大於marker之後的檔案
  • delimiter 用於獲取檔案的公共首碼
  • max-keys 用於指定最多返回的檔案個數
  1. let OSS = require('ali-oss');
  2. let client = new OSS({
  3. region: '<Your region>',
  4. accessKeyId: '<Your AccessKeyId>',
  5. accessKeySecret: '<Your AccessKeySecret>',
  6. bucket: 'Your bucket name'
  7. });
  8. async function list () {
  9. try {
  10. // 不帶任何參數,預設最多返回1000個檔案
  11. let result = await client.list();
  12. console.log(result);
  13. // 根據nextMarker繼續列出檔案
  14. if (result.isTruncated) {
  15. let result = await client.list({
  16. marker: result.nextMarker
  17. });
  18. }
  19. // 列出首碼為'my-'的檔案
  20. let result = await client.list({
  21. prefix: 'my-'
  22. });
  23. console.log(result);
  24. // 列出首碼為'my-'且在'my-object'之後的檔案
  25. let result = await client.list({
  26. prefix: 'my-',
  27. marker: 'my-object'
  28. });
  29. console.log(result);
  30. } catch (e) {
  31. console.log(e);
  32. }
  33. }
  34. list();

模擬目錄結構

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

運行結果如下:

  1. > await listDir('foo/')
  2. => SubDir: foo/bar/
  3. SubDir: foo/hello/
  4. Object: foo/x
  5. Object: foo/y
  6. > await listDir('foo/bar/')
  7. => Object: foo/bar/a
  8. Object: foo/bar/b
  9. > await 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. let OSS = require('ali-oss')
  2. let client = new OSS({
  3. region: '<Your region>',
  4. accessKeyId: '<Your AccessKeyId>',
  5. accessKeySecret: '<Your AccessKeySecret>',
  6. bucket: 'Your bucket name'
  7. });
  8. async function put () {
  9. try {
  10. let result = await client.put('object-key', 'local-file', {
  11. meta: {
  12. year: 2016,
  13. people: 'mary'
  14. }
  15. });
  16. console.log(result);
  17. } catch (e) {
  18. console.log(e);
  19. }
  20. }
  21. put();

通過putMeta介面來更新檔案元資訊:

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

拷貝檔案

使用copy拷貝一個檔案。拷貝可以發生在下面兩種情況:

  • 同一個Bucket
  • 兩個不同Bucket,但是它們在同一個region,此時的源Object名字應為’/bucket/object’的形式

另外,拷貝時對檔案元資訊的處理有兩種選擇:

  • 如果沒有指定meta參數,則與源檔案相同,即拷貝源檔案的元資訊
  • 如果指定了meta參數,則使用新的元資訊覆蓋源檔案的資訊
  1. let OSS = require('ali-oss')
  2. let client = new OSS({
  3. region: '<Your region>',
  4. accessKeyId: '<Your AccessKeyId>',
  5. accessKeySecret: '<Your AccessKeySecret>',
  6. bucket: 'Your bucket name'
  7. });
  8. async function copy () {
  9. try {
  10. // 兩個Bucket之間拷貝
  11. let result = await client.copy('to', '/from-bucket/from');
  12. console.log(result);
  13. // 拷貝元資訊
  14. let result = await client.copy('to', 'from');
  15. console.log(result);
  16. // 覆蓋元資訊
  17. let result = await client.copy('to', 'from', {
  18. meta: {
  19. year: 2015,
  20. people: 'mary'
  21. }
  22. });
  23. console.log(result);
  24. } catch (e) {
  25. console.log(e);
  26. }
  27. }

刪除檔案

通過delete來刪除某個檔案:

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

大量刪除檔案

通過deleteMulti來刪除一批檔案,使用者可以通過quiet參數來指定是否返回刪除的結果:

  1. let OSS = require('ali-oss')
  2. let client = new OSS({
  3. region: '<Your region>',
  4. accessKeyId: '<Your AccessKeyId>',
  5. accessKeySecret: '<Your AccessKeySecret>',
  6. bucket: 'Your bucket name'
  7. });
  8. async function deleteMulti () {
  9. try {
  10. let result = await client.deleteMulti(['obj-1', 'obj-2', 'obj-3']);
  11. console.log(result);
  12. let result = await client.deleteMulti(['obj-1', 'obj-2', 'obj-3'], {
  13. quiet: true
  14. });
  15. console.log(result);
  16. } catch (e) {
  17. console.log(e);
  18. }
  19. }
  20. deleteMulti();