edit-icon download-icon

オブジェクトのアップロード

最終更新日: Mar 14, 2018

OSS にファイルをアップロードするには、次のいずれかの方法があります。

  • ローカルファイルのアップロード
  • ストリームアップロード
  • バッファコンテンツのアップロード
  • マルチパートアップロード
  • 再開可能アップロード

ローカルファイルのアップロード

put インターフェースを使用して、ローカルファイルを OSS にアップロードできます。

  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. console.log(result);
  12. }).catch(function (err) {
  13. console.log(err);
  14. });

ストリームアップロード

putStream インターフェースを使用して、ストリーム内のコンテンツをアップロードすることができます。stream パラメーターは、オブジェクトストリームおよびネットワークストリームを含む ‘読み取り可能なストリーム’ を実装する任意のオブジェクトとすることができる。putStream インターフェースを使用すると、SDK はデフォルトで chunked encoding HTTP PUT リクエストを開始します。オプションで contentLength パラメーターを指定すると、chunked encoding は使用されません。

  1. var co = require('co');
  2. var OSS = require('ali-oss');
  3. var fs = require('fs');
  4. var client = new OSS({
  5. region: '<Your region>',
  6. accessKeyId: '<Your AccessKeyId>',
  7. accessKeySecret: '<Your AccessKeySecret>',
  8. bucket: 'Your bucket name'
  9. });
  10. co(function* () {
  11. // use 'chunked encoding'
  12. var stream = fs.createReadStream('local-file');
  13. var result = yield client.putStream('object-key', stream);
  14. console.log(result);
  15. // don't use 'chunked encoding'
  16. var stream = fs.createReadStream('local-file');
  17. var size = fs.statSync('local-file').size;
  18. var result = yield client.putStream(
  19. 'object-key', stream, {contentLength: size});
  20. console.log(result);
  21. }).catch(function (err) {
  22. console.log(err);
  23. });

バッファコンテンツのアップロード

put インターフェースを介してバッファ内のオブジェクトコンテンツを OSS にアップロードすることができます。

  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', new Buffer('hello world'));
  11. console.log(result);
  12. }).catch(function (err) {
  13. console.log(err);
  14. });

マルチパートアップロード

アップロードするファイルが大きい場合、マルチパートアップロードのために multipartUpload インターフェースを使用することができます。マルチパートアップロードの利点は、大きなリクエストを複数の小さなリクエストに分割して実行することです。その結果、要求の一部が失敗した場合、ファイル全体をアップロードする必要はありませんが、失敗した部分だけをアップロードすることができます。一般に、100 MB を超えるオブジェクトの場合、上記のマルチパートアップロードアプローチをお勧めします。

関連するパラメータ:

  • name {String}:オブジェクト名
  • file {String|File}:ファイルパスまたは HTML5 Web ファイル
  • [options] {Object}:オプションのパラメータ
    • [checkpoint] {Object}:再開可能アップロードで使用されるエンドポイントチェックポイント。このパラメータを設定すると、エンドポイントからアップロードが開始されます。設定されていない場合は、アップロードが再開されます。
    • [partSize]{Number}:部品サイズ
    • [progress] {Funtion}:ジェネレータ関数またはサンク。コールバック関数には、次の 3 つのパラメータが含まれています。
      • (percentage {Number}:アップロードの進捗状況(0〜1 の小数点以下の桁数)
      • checkpoint {Object}:エンドポイントチェックポイント
      • res {Object}):1 つのパートが正常にアップロードされた後に返されるレスポンス
    • [meta] {Object}:プレフィックス x-oss-meta- を持つユーザが定義したヘッダメタ情報
    • [headers] {Object}:余分なヘッダー。詳細については、RFC2616を参照してください。
      • ‘Cache-Control’:HTTP 要求と応答でコマンドを指定することによってキャッシュメカニズムを実装するために使用される一般的なヘッダー。例: Cache-Control: public, no-cache
      • ‘Content-Disposition’:内部リファレンス(ウェブページまたはページの一部)またはローカルでダウンロードされて保存された添付ファイルである、レスポンスのデリゲーションフォームを示すために使用されます。例: Content-Disposition:somename
      • ‘Content-Encoding’:特定のメディアタイプのデータを圧縮するために使用されます。例: Content-Encoding:gzip
      • ‘Expires’:有効期限。例: Expires:3600000
  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.multipartUpload('object-key', 'local-file', {
  11. progress: function* (p) {
  12. console.log('Progress: ' + p);
  13. }
  14. meta: {
  15. year: 2017,
  16. people: 'test'
  17. }
  18. });
  19. console.log(result);
  20. var head = yield client.head('object-key');
  21. console.log(head);
  22. }).catch(function (err) {
  23. console.log(err);
  24. });

上記の progress パラメーターは、アップロードの進行状況を取得するために使用される進行状況コールバック関数です。progress パラメーターは、ジェネレータ関数( function *)または thunk です。

  1. var progress = function (p) {
  2. return function (done) {
  3. console.log(p);
  4. done();
  5. };
  6. };

前述の meta パラメータは、ユーザが定義したメタデータであり、ヘッドインタフェースを通じてオブジェクトのメタデータを取得できます。

再開可能アップロード

マルチパートアップロードには、ユーザーが進捗状況コールバックを渡せるようにする progress パラメータが用意されています。コールバック SDK では、現在成功しているアップロードの割合とチェックポイント情報がパラメーターとして使用されます。再開可能アップロードを実現するために、アップロードプロセス中にチェックポイント情報を保存する必要があります。

エラーが発生した場合、保存されたチェックポイントをパラメーターとして multipartUpload に渡すことができ、最後に失敗した部分からアップロードが再開されます。

  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 checkpoint;
  11. // retry 5 times
  12. for (var i = 0; i < 5; i++) {
  13. var result = yield client.multipartUpload('object-key', 'local-file', {
  14. checkpoint: checkpoint,
  15. progress: function* (percentage, cpt) {
  16. checkpoint = cpt;
  17. }
  18. });
  19. console.log(result);
  20. break; // break if success
  21. } catch (err) {
  22. console.log(err);
  23. }
  24. }
  25. }).catch(function (err) {
  26. console.log(err);
  27. });

上記のコードは、チェックポイントを変数に保存するだけです。 プログラムがクラッシュした場合、情報は失われます。 また、オブジェクトに情報を保存し、プロジェクトの再起動後にオブジェクトからチェックポイント情報を読み取ることもできます。