このトピックでは、アプリケーションサーバーでNode.jsを使用してリクエストに署名を追加し、アップロードコールバックを設定してから、フォームアップロードを使用してデータをObject Storage Service (OSS) にアップロードする方法について説明します。
前提条件
- アプリケーションサーバーのドメイン名は、インターネット経由でアクセスできます。
- Node.js 8.0以降がアプリケーションサーバーにインストールされます。 node -vコマンドを実行して、アプリケーションサーバーで使用されているNode.jsのバージョンを取得できます。
- クライアントが使用するブラウザは、HTML4、HTML5、Flash、およびSilverlightをサポートする必要があります。
手順1: アプリサーバーの設定
- アプリケーションサーバーのソースコードをダウンロードします。
- Ubuntu 16.04がこの例で使用されています。 ソースコードを /home/aliyun/aliyun-oss-appserver-node.jsディレクトリに解凍します。
- プロジェクトのルートディレクトリでnpm installコマンドを実行します。
- プロジェクトのルートディレクトリで
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: クライアントの設定
- クライアントソースコードをダウンロードします。
- パッケージをディレクトリに解凍します。 この例では、
D:\aliyun\aliyun-oss-appserver-js
ディレクトリが使用されています。 - ディレクトリに移動します。
upload.js
ファイルを開きます。 次のコードを見つけます。// serverUrlは、ユーザーが署名やアップロードポリシーなどの情報を取得するために使用するアプリケーションサーバーのURLを指定します。 IPアドレスとポート番号を実際の情報に置き換えます。 serverUrl = 'http:// 88.88.88.88:8888 '
severUrl
をアプリケーションサーバーのURLに設定します。 たとえば、severUrlをserverUrl = 'https:// oss-demo.aliyuncs.com:23450 '
に設定すると、クライアントはURLを使用して署名やアップロードポリシーなどの必要な情報を取得できます。
ステップ3: CORSの設定
フォームアップロードを使用してクライアントからOSSにデータをアップロードすると、クライアントはブラウザを使用してOrigin
ヘッダーを含むリクエストをOSSに送信します。 次に、OSSは、Origin
ヘッダーを含むリクエストを、特定のバケットに設定したクロスオリジンリソース共有 (CORS) ルールと照合します。 したがって、ユーザーがPOSTメソッドを使用してバケットにデータをアップロードする前に、バケットのCORSルールを設定する必要があります。
- OSSコンソールにログインします。
- 左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、目的のバケットの名前をクリックします。
- 左側のナビゲーションツリーで、 を選択します。
- [ルールの作成] をクリックし、次の図に示すパラメーターを設定します。 説明 データのセキュリティを確保するために、OSSでリクエストを許可する実際のドメイン名をソースで指定することを推奨します。 パラメーターの設定方法の詳細については、「CORSルールの設定」をご参照ください。
ステップ4: アップロードコールバック要求を送信する
- アプリケーションサーバーのルートディレクトリで、npm run serverコマンドを実行して、アプリケーションサーバーを起動します。
- PCクライアントで、クライアントソースコードのディレクトリにあるindex.htmlファイルを開きます。
- [ファイルの選択] をクリックします。 指定したタイプのファイルを選択します。 [アップロード] をクリックします。 オブジェクトがアップロードされると、アプリケーションサーバーから返されたコンテンツが表示されます。
アプリケーションサーバーのソースコードの解析
アプリケーションサーバーのソースコードには、署名の追加、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" }); });
アップロードコールバックの詳細については、「コールバック」をご参照ください。