アップロードポリシーを取得するためにアプリケーションサーバーにリクエストを送信すると、アプリケーションサーバーはアップロードポリシーと署名を返します。 署名を使用して、オブジェクトをobject Storage Service (OSS) にアップロードします。 このメソッドは、フロントエンドページでAccessKeyペアを公開しません。 この方法は、クライアントに署名を追加してOSSにデータをアップロードするよりも安全です。 このトピックでは、アプリケーションサーバーから署名情報を取得し、OSSにデータをアップロードする方法について説明します。
リクエストプロセス
次の図は、リクエストプロセスを示しています。
コード解析
次のセクションでは、プロセスについて説明します。
アップロードポリシーを取得するために、アプリケーションサーバーにリクエストを送信します。
client source codeパッケージの
upload.js
ファイルで、次のスニペットのserverUrl
変数をアプリケーションサーバーのURLに設定します。// serverUrlは、署名とアップロードポリシーに関する情報を返すアプリケーションサーバーのURLを指定します。 ビジネスシナリオでは、サンプルのIPアドレスとポート番号を実際の値に置き換えます。 serverUrl = 'http:// 88.88.XX.XX:8888 '
アプリケーションサーバーのURLを設定すると、クライアントはGETリクエストを
serverUrl
に送信して必要な情報を取得します。アップロードコールバックは、このトピックで説明するシナリオには関与しません。 したがって、アップロードコールバック機能を無効にするには、クライアントソースコードパッケージの
upload.jsファイル
の'callback' : callbackbody
フィールドをコメントアウトする必要があります。 例:{ 'key' : key + '${filename}' 、 'policy': policyBase64、 'OSSAccessKeyId': accessid、 // アプリケーションサーバーから返されるHTTPステータスコードを200に設定します。 デフォルトでは、HTTPステータスコード204が返されます。 'success_action_status ' : '200' 、 // 'callback' : callbackbody、 'signature': signature、}
アプリケーションサーバーは、アップロードポリシーと署名を返します。
サービスは、クライアントから送信されたGET要求に応答するためにアプリケーションサーバーにデプロイされます。 次に、アプリケーションサーバーは、オブジェクトをアップロードするために必要な署名情報を返します。 コードを変更して、アプリケーションサーバーがクライアントに正しい情報を返すようにすることができます。
次のサンプルコードは、アプリケーションサーバーによってクライアントに返されるメッセージ本文の内容の例を示しています。
{ "accessid":"LTAI5tBDFVar1hoq ****" 、 "ホスト":"https://post-test.oss-cn-hangzhou.aliyuncs.com" 、 "ポリシー":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i ****" 、 "signature":"VsxOcOudx ****** z93CLaXPz + 4s=" 、 "expire":1446727949, "dir":"user-dirs/" }
次の表に、メッセージ本文に含まれるフィールドを示します。
フィールド
説明
accessid
リクエストの送信に使用されるAccessKey ID。
ホスト
アップロード要求の送信先のドメイン名。
説明カスタムドメイン名はサポートされていません。
policy
フォームアップロードのポリシー。 ポリシーはBase64-encoded文字列です。 詳細については、「付録: ポリシー」をご参照ください。
署名
ポリシーの署名文字列。 詳細については、「付録: 署名」をご参照ください。
期限切れ
サーバーによって指定されたポリシーの有効期限。 タイムスタンプはUNIXの時刻形式に従います。 1970年1月1日の00:00:00から経過した秒数です。
dir
アップロードするオブジェクトの名前に含まれるプレフィックス。
PostObject操作を呼び出して、データをOSSにアップロードします。
説明ファイルフォームフィールドを除き、keyを含むすべてのフォームフィールドのサイズは8 KBを超えることはできません。
デフォルトでは、アップロードするオブジェクトと同じ名前の既存のオブジェクトが上書きされます。 同じ名前の既存のオブジェクトを上書きしない場合は、アップロード要求にx-oss-forbid-overwriteヘッダーを含め、x-oss-forbid-overwriteヘッダーをtrueに設定します。 この方法では、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、アップロードは失敗し、OSSはFileAlreadyExistsエラーコードを返します。
new_multipart_params = { // keyは、バケット内のオブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txtオブジェクト バケット名をフルパスに含めないでください。 // filenameは、アップロードするローカルファイルの名前を指定します。 'key' : key + '${filename}' 、 'policy': policyBase64、 'OSSAccessKeyId': accessid、 // アプリケーションサーバーから返されるHTTPステータスコードを200に設定します。 このパラメーターを設定しない場合、HTTPステータスコード204が返されます。 'success_action_status ' : '200' 、 'signature': signature、 };
手順
迅速な展開
Resource Orchestration Service (ROS) を使用して、Elastic Compute Service (ECS) インスタンスとOSSバケットを設定し、ECSインスタンスにアプリケーションサーバーソースコードとクライアントソースコードをデプロイできます。 ROSを使用してアプリケーションサーバーから署名情報を取得し、OSSにデータをアップロードするには、次の手順を実行します。
数回クリックするだけでクラウドリソースをデプロイできます。
ROSコンソールの [スタックの作成] ウィザードに移動します。
ROSコンソールの [スタックの作成] ウィザードの [テンプレートの選択] ステップで、スタック名と作成するOSSバケットの名前を入力します。 購入するECSインスタンスのゾーン、インスタンスタイプ、システムディスクカテゴリ、およびパスワードを指定し、作成する をクリックします。
表示されるページの [スタック情報] タブで、スタックのステータスは [作成中] になります。
スタックのステータスが [作成済み] になったら、[出力] タブをクリックして、数回クリックするだけでデプロイされるECSインスタンスやOSSバケットなどのリソースを表示します。
アプリケーションサーバーから署名情報を取得し、OSSにデータをアップロードします。
[出力] タブで、OssClientAddressの値をコピーしてブラウザで開きます。
[WebクライアントからOSSへのデータ転送] ページで、[ファイルの選択] をクリックし、特定の種類のファイルを選択し、[アップロード] をクリックします。
不要なコストを回避するためにテストリソースをリリースします。
スタックページの右上隅にある 削除 をクリックします。
リソーススタックの削除 ダイアログボックスで、スタックを削除する方法 を リソースのリリース に設定し、決定 をクリックします。
参考資料
ほとんどの場合、アプリケーションサーバは、アップロードされたオブジェクトの名前など、アップロードされたオブジェクトに関する情報を通知される必要がある。 画像をアップロードする場合は、アプリケーションサーバーに画像サイズを通知する必要があります。 上記の要件を満たすようにアップロードコールバックを設定できます。 詳細については、「概要」をご参照ください。