すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:Node.js

最終更新日:Dec 20, 2023

このトピックでは、アプリケーションサーバーでNode.jsを使用してリクエストに署名を追加し、アップロードコールバックを設定してから、フォームアップロードを使用してデータをObject Storage Service (OSS) にアップロードする方法について説明します。

前提条件

  • アプリケーションサーバーのドメイン名は、インターネット経由でアクセスできます。
  • Node.js 8.0以降がアプリケーションサーバーにインストールされます。 node -vコマンドを実行して、アプリケーションサーバーで使用されているNode.jsのバージョンを取得できます。
  • クライアントが使用するブラウザは、HTML4、HTML5、Flash、およびSilverlightをサポートする必要があります。

手順1: アプリサーバーの設定

  1. アプリケーションサーバーのソースコードをダウンロードします。
  2. Ubuntu 16.04がこの例で使用されています。 ソースコードを /home/aliyun/aliyun-oss-appserver-node.jsディレクトリに解凍します。
  3. プロジェクトのルートディレクトリでnpm installコマンドを実行します。
  4. プロジェクトのルートディレクトリでapp.jsソースコードファイルを見つけ、次のスニペットを変更します。
    const config = {
      // Alibaba CloudアカウントのAccessKeyペアを使用してOSSにアクセスすると、アカウントにはすべてのAPI操作に対する権限があるため、セキュリティ上のリスクが生じる可能性があります。 API操作の呼び出しやルーチンのO&Mの実行には、Resource Access Management (RAM) ユーザーを使用することを推奨します。RAMユーザーを作成するには、RAMコンソールにログインします。 
      accessKeyId: 'yourAccessKeyId' 、 
      accessKeySecret: 'yourAccessKeySecret' 、
      // Specify the bucket name. 
      bucket: 'yourBucket' 、
      // アップロードコールバック要求の送信先のアプリケーションサーバーのURLを設定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトがアップロードされると、OSSはURLを使用してオブジェクトに関する情報をアプリケーションサーバーに送信します。 たとえば、callbackUrlをhttps://oss-demo.aliyuncs.com:23450に設定できます。 
      callbackUrl: 'yourCallBackUrl' 、
      // アップロードするオブジェクトのプレフィックスを指定する場合は、パラメーターを設定します。 それ以外の場合は、パラメータを空のままにします。 
      dir: 'yourPrefix'
    } 

ステップ2: クライアントの設定

  1. クライアントソースコードをダウンロードします。
  2. パッケージをディレクトリに解凍します。 この例では、D:\aliyun\aliyun-oss-appserver-jsディレクトリが使用されています。
  3. ディレクトリに移動します。 upload.jsファイルを開きます。 次のコードを見つけます。
    // serverUrlは、ユーザーが署名やアップロードポリシーなどの情報を取得するために使用するアプリケーションサーバーのURLを指定します。 IPアドレスとポート番号を実際の情報に置き換えます。 
    serverUrl = 'http:// 88.88.88.88:8888 ' 
  4. severUrlをアプリケーションサーバーのURLに設定します。 たとえば、severUrlをserverUrl = 'https:// oss-demo.aliyuncs.com:23450 'に設定すると、クライアントはURLを使用して署名やアップロードポリシーなどの必要な情報を取得できます。

ステップ3: CORSの設定

フォームアップロードを使用してクライアントからOSSにデータをアップロードすると、クライアントはブラウザを使用してOriginヘッダーを含むリクエストをOSSに送信します。 次に、OSSは、Originヘッダーを含むリクエストを、特定のバケットに設定したクロスオリジンリソース共有 (CORS) ルールと照合します。 したがって、ユーザーがPOSTメソッドを使用してバケットにデータをアップロードする前に、バケットのCORSルールを設定する必要があります。

  1. OSSコンソールにログインします。
  2. 左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、目的のバケットの名前をクリックします。
  3. 左側のナビゲーションツリーで、[コンテンツセキュリティ] > [クロスオリジンリソース共有 (CORS)] を選択します。
  4. [ルールの作成] をクリックし、次の図に示すパラメーターを設定します。
    説明 データのセキュリティを確保するために、OSSでリクエストを許可する実際のドメイン名をソースで指定することを推奨します。 パラメーターの設定方法の詳細については、「CORSルールの設定」をご参照ください。

ステップ4: アップロードコールバック要求を送信する

  1. アプリケーションサーバーのルートディレクトリで、npm run serverコマンドを実行して、アプリケーションサーバーを起動します。
  2. PCクライアントで、クライアントソースコードのディレクトリにあるindex.htmlファイルを開きます。
  3. [ファイルの選択] をクリックします。 指定したタイプのファイルを選択します。 [アップロード] をクリックします。
    オブジェクトがアップロードされると、アプリケーションサーバーから返されたコンテンツが表示されます。

アプリケーションサーバーのソースコードの解析

アプリケーションサーバーのソースコードには、署名の追加、OSSへのオブジェクトのアップロード、アップロードコールバックの設定のための完全なサンプルコードが含まれています。 次のコードは、コアコードスニペットのみを提供します。 機能の実装方法の詳細については、アプリケーションサーバーのソースコードをダウンロードして詳細を確認してください。

  • リクエストへの署名の追加とOSSへのオブジェクトのアップロード
    次のスニペットは、署名に使用されるパラメーター値とアプリケーションサーバーのURLを取得する方法の例を示しています:
    app.get("/", async (req, res) => {
      const client = new OSS(config);
    
      const date = new Date();
      date.setDate(date.getDate() + 1);
      const policy = {
        expiration: date.toISOString(), // アップロード要求のタイムアウト期間を識別するために、1970年1月1日のUTC時刻からのUNIXタイムスタンプを秒単位で設定します。 
        条件: [
          ["content-length-range", 0, 1048576000] // アップロードするオブジェクトのサイズ制限を設定します。       
        ],
      };
    
      // CORSルールを設定します。 
      res.set({
        "Access-Control-Allow-Origin": req.headers.origin | | "*" 、
        "Access-Control-Allow-Methods": "PUT、POST、GET" 、
      });
    
      // SDKを使用して署名を取得します。 
      const formData = awai t client.ca lculatePostSignature (ポリシー);
      // インターネット経由でバケットのエンドポイントを指定します。 
      const host = 'http://${config.bucket}.${
        (await client.getBucketLocation()).location
      } .aliyuncs.com '.toString();
      // Configure upload callback. 
      const callback = {
        callbackUrl: config.ca llbackUrl,// アップロードコールバック要求の送信に使用するアプリケーションサーバーのURLを設定します。 例: http://oss-demo.aliyuncs.com:23450。 
        callbackBody:// アップロードされたオブジェクトのETagやmimeTypeなど、コールバック要求に含めるコンテンツを指定します。 
          "filename =${ object}&size =${ size}&mimeType =${ mimeType}&height =${ imageInfo.height}&width =${ imageInfo.width}" 、
        callbackBodyType: "application/x-www-form-urlencoded",// コールバック情報のコンテンツタイプを設定します。     
      };
    
      // レスポンスに含まれる必要なパラメーターを指定します。 
      const params = {
        expire: moment().add(1, "days").unix().toString(),
        policy: formData.policy, // OSSから取得したポリシー。 
        signature: formData.Signature, // OSSから取得した署名。 
        accessid: formData.OSSAccessKeyId,// OSSから取得したAccessKey ID。 
        ホスト, // 形式はhttps:// bucketname.endpointです。 例: https://bucket-name.oss-cn-hangzhou.aliyuncs.com。 
        callback: Buffer.from(JSON.stringify(callback)).toString("base64"),// Buffer.fromを使用したBase64-encodedのJSON。 
        dir: config.dir,// アップロードされたオブジェクトの取得されたプレフィックス。 
      };
    
      res.json(params);
    }); 
  • アップロードコールバック

    次のスニペットは、OSSから送信されたコールバック要求に対してアプリケーションサーバーから返されるPOST応答を設定する方法の例を示しています。

    // /resultパスのPOSTリクエストをリッスンします。 
    app.post("/result", (req, res) => {
      // Base64を使用してOSS公開鍵のアドレスをデコードします。 
      const pubKeyAddr = Buffer.from (
        req.headers["x-oss-pub-key-url"] 、
        "base64"
      ).toString("ascii");
      // リクエストヘッダーのx-oss-pub-key-urlがOSSからのものかどうかを確認します。 
      if (
        ! pubKeyAddr.startsWith("https://gosspublic.alicdn.com/") &&
        ! pubKeyAddr.startsWith("https://gosspublic.alicdn.com/")
      ) {
        console.log("pub key addr must be oss addrss");
        // そうでない場合は、アップロードコールバックが失敗したことを示す "verify not ok" を返します。 
        res.json({ステータス: "verify not ok" });
      }
      // x-oss-pub-key-urlがOSSから取得された場合、これはアップロードコールバックが成功したことを示します。 
      res.json({ステータス: "Ok" });
    }); 

    アップロードコールバックの詳細については、「コールバック」をご参照ください。