このトピックでは、POSTポリシーに基づいてさまざまなプログラミング言語でサーバーから署名情報を取得し、アップロードコールバックを設定してから、フォームアップロードを使用してデータをObject Storage Service (OSS) にアップロードする方法について説明します。
背景情報
ユーザーがオブジェクトをOSSにアップロードする場合、アップロードに関する情報とオブジェクトの名前をアプリケーションサーバーに送信する必要があります。 ユーザーが画像をアップロードするときは、画像のサイズに関する情報をアプリケーションサーバーに送信する必要があります。 この要件を満たすために、OSSはアップロードコールバック機能を提供します。
処理中
ユーザーがオブジェクトをOSSにアップロードするときにアプリケーションサーバーにアップロードコールバック要求を受信させたい場合は、OSSがアップロードコールバック要求をアプリケーションサーバーに送信するようにコールバック関数を設定します。 ユーザーがオブジェクトをアップロードすると、アプリケーションサーバーはアップロードコールバック要求に対する応答をOSSに返します。 その後、OSSは応答をユーザーに転送します。 この応答はアップロード結果です。
例
プロセス分析
次のプロセスでは、使用されるコアコードと返されるメッセージについて説明します。
ユーザーがアプリケーションサーバーにリクエストを送信して、アップロードポリシーとコールバック設定を取得します。
クライアントソースコードの
upload.js
ファイルでは、serverUrl
変数の値を使用してアプリケーションサーバーのURLを設定できます。 アプリケーションサーバーのURLを設定すると、クライアントはGETリクエストをserverUrl
に送信して必要な情報を取得します。// serverUrlは、署名とアップロードポリシーに関する情報を返すアプリケーションサーバーのURLを指定します。 ビジネスシナリオでは、サンプルのIPアドレスとポート番号を実際の値に置き換えます。 serverUrl = 'http:/88.88.XX.XXX:8888 '
アプリケーションサーバーは、アップロードポリシーと、アップロードコールバックを構成するために使用されるコードをユーザーに返します。
アプリケーションサーバは、直接データ転送のためにクライアントから送信されるGET要求を処理する。 対応するコードを変更して、アプリケーションサーバーがクライアントに正しいメッセージを返すようにすることができます。 さまざまなプログラミング言語の設定ドキュメントには、参照用の明確な指示があります。
次の例では、クライアントに返されるメッセージ本文について説明します。 メッセージ本文は、クライアントからオブジェクトをアップロードするために重要です。
{ "accessid":"LTAI5tAzivUnv4ZF1azP ****" 、"ホスト":"http://post-test.oss-cn-hangzhou.aliyuncs.com" 、"ポリシー":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i ****" 、"signature":"I2u57FWjTKqX/AE6doIdyff1 ****" 、"expire":1446727949、"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jb206MjM0NTAiLAoiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSZoZWlnaHQ9JHtpbWFnZUluZm8uaGVpZ2h0fSZ3aWR0aD0ke2ltYWdlSW5mby53aWR0aH0iLAoiY2FsbGJhY2tCb2R5VHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9" 、"dir":"user-dirs/" }
上記の例のコールバックに対して返されるコンテンツはBase64-encodedです。 次のサンプルコードは、Base64-decodedの内容を示しています。
{"callbackUrl":"http://oss-demo.aliyuncs.com:23450" 、"callbackBody":"filename =${ object}&size =${ size}&mimeType =${ mimeType}&height =${ imageInfo.height}&width =${ imageInfo.width}" 、"callbackBodyType":"application/x-www-form-urlencoded"}
説明上記の例で使用されているコールバックメソッドは、参照用にのみ提供されています。 サーバーコードを変更することで、コールバックメソッドを設定できます。
パラメーター
説明
callbackUrl
OSSがリクエストを送信するアプリケーションサーバーのURL。
callbackHost
OSSからアプリケーションサーバーに送信されるリクエストに含まれるHostヘッダー。
callbackBody
OSSがアプリケーションサーバーに送信するコンテンツ。 画像以外のオブジェクトをアップロードする場合、コンテンツはオブジェクト名、サイズ、およびタイプになります。 画像をアップロードする場合、コンテンツは画像の高さと幅になります。
callbackBodyType
リクエストのコンテンツタイプ。
有効な値:
application/x-www-form-urlencoded (デフォルト)
application/json
ユーザーがOSSにオブジェクトアップロードリクエストを送信します。
クライアントソースコードの
upload.js
ファイルでは、callbackbody
の値は、ステップ2でアプリケーションサーバーからクライアントに返されるコールバックボディに含まれています。new_multipart_params = { 'key' : key + '${filename}' 、 'policy': policyBase64、 'OSSAccessKeyId': accessid、 // アプリケーションサーバーから返されるHTTPステータスコードを200に設定します。 このパラメーターを設定しない場合、HTTPステータスコード204が返されます。 'success_action_status ' : '200' 、 'callback': callbackbody、 'signature': signature、 };
OSSは、コールバック設定に基づいてコールバック要求をアプリケーションサーバーに送信します。
オブジェクトをOSSにアップロードした後、OSSはクライアントのアップロードコールバック設定を解析し、POSTコールバック要求をアプリケーションサーバーに送信します。 次のサンプルコードは、リクエストメッセージの内容を示しています。
ハイパーテキスト転送プロトコル POST / HTTP/1.1\r\n Host47.97.XXX.XX53\r\n 接続: close\r\n コンテンツ長: 76\r\n 承認: fsNxFF0w ******* MNAoFb // a8x6v2lI1 ****** h3nFUDALgku9bhC + cWQsnxuCo ****** tBUmnDI6k1PofggA4g ==\ n Content-MD5: eiEMyp7lbL8KStPBzMdr9w =\ r\n コンテンツタイプ: application/x-www-form-urlencoded\r\n 日付: 9月15日 (土) 2018 10:24:12 GMT\r\n ユーザーエージェント: aliyun-oss-callback\r\n x-oss-additional-headers: \r\n x-oss-bucket: signedcallback\r\n x-oss-owner: 137918634953 ****\r\n x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnaH ****\r\n x-oss-request-id: 534B371674E88A4D8906 ****\r\n x-oss-requester: 137918634953 ****\r\n x-oss-signature-version: 1.0\r\n x-oss-tag: CALLBACK\r\n eagleeye-rpcid: 0.1\r\n \r\n [フルリクエストURI: http:// 47.xx. xx.53/] [HTTPリクエスト1/1] [フレーム内の応答: 39] ファイルデータ: 76バイト HTMLフォームURLエンコード: application/x-www-Form-urlencoded フォームアイテム: "filename" = ".snappython.png" フォームアイテム: "size" = "6014" フォームアイテム: "mimeType" = "image/png" フォームアイテム: "height" = "221"
アプリケーションサーバーがOSSに応答を返します。
アプリケーションサーバーは、OSSによって送信されたメッセージに含まれる
承認
ヘッダーに基づいて署名を検証します。 検証が成功すると、アプリケーションサーバーは次のメッセージをJSON形式でOSSに返します。{ "String value": "ok" 、"キー": "ステータス" }
OSSは、アプリケーションサーバーからユーザーに応答を転送します。
クライアントのソースコードの解析
クライアントソースコードをダウンロードするには、aliyun-oss-appserver-js-master.zipをクリックします。
Pluploadは、クライアントのJavaScriptコードに使用されます。 Pluploadは、ファイルをアップロードできるシンプルで使いやすい強力なツールです。 このツールは、HTML、Flash、Silverlight、およびHTML5を使用したアップロードを含む、複数のアップロード方法をサポートしています。 Pluploadは現在の環境を検出し、最適なアップロード方法を選択します。 このツールは、アップロードのために最も高い優先順位をHTML5に割り当てます。 Pluploadの詳細については、Plupload.comをご覧ください。
次のサンプルコードでは、一般的な機能について説明します。
アップロードするオブジェクトにランダムな名前を指定する
拡張子を変更せずにランダムなオブジェクト名を指定する場合は、次のコードを使用して関数を変更できます。
関数check_object_radio() { g_object_name_type = 'random_name'; }
元のオブジェクト名を保持する
元のオブジェクト名を保持する場合は、次のコードを使用して関数を変更できます。
関数check_object_radio() { g_object_name_type = 'local_name'; }
オブジェクトをアップロードするディレクトリの設定
オブジェクトをアップロードするディレクトリは、サーバーによって決定されます。 指定したディレクトリにのみオブジェクトをアップロードできます。 これにより、データの分離が保証されます。 次のコードは、OSS SDK for PHPを使用してディレクトリをabc /に設定する方法を示しています。 ディレクトリはスラッシュ (/) で終わる必要があります。
$dir ='abc/';
アップロード条件の設定
Pluploadフィルターを使用して、画像のみのアップロード、アップロードできるオブジェクトのサイズの制限の設定、オブジェクトの繰り返しアップロードの防止などのアップロード条件を設定できます。
var uploader = new plupload.Uploader({ ... filters: { mime_types : [ // 画像とZIPオブジェクトのみをアップロードできるように指定します。 { title : "Image files", extensions : "jpg,gif,png,bmp" }, {title : "Zip files", extensions : "zip"} ], // 400 KB未満のサイズのオブジェクトのみをアップロードできるように指定します。 max_file_size : '400kb' 、 // オブジェクトの繰り返しアップロードを拒否するように指定します。 prevent_duplicates : true },
mime_types: アップロードするオブジェクトの名前拡張子。
max_file_size: アップロードするオブジェクトの最大サイズ。
prevent_duplicates: オブジェクトを繰り返しアップロードできるかどうかを指定します。
アップロードされたオブジェクトの名前の取得
Pluploadを使用してFileUploadedイベントを呼び出すことで、アップロードされたオブジェクトの名前を取得できます。
FileUploaded: 関数 (up、file、info) { if (info.status == 200) { document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name); } else { document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response; } }
get_uploaded_object_name(file.name)
関数を使用して、OSSにアップロードされたオブジェクトの名前を取得できます。file.name
パラメータは、オブジェクトがアップロードされる前のオブジェクトの名前を指定します。署名のアップロード
次のJavaScriptサンプルコードを使用して、サーバーからpolicyBase64、accessid、およびsignature変数を取得できます。
関数get_signature() { // expireパラメーターの値が現在の時刻を超えているかどうかを判断します。 値が現在の時刻を超える場合は、新しい署名を要求する必要があります。 署名は3秒後に返されます。 now = timestamp = Date.parse(new Date()) / 1000; if (expire < now + 3) { body = send_request() var obj = eval ("(" + body + ")"); host = obj['host'] policyBase64 = obj['policy'] accessid = obj['accessid'] signature = obj['signature'] expire = parseInt(obj['expire']) callbackbody = obj['callback'] key = obj['dir'] return true; } falseを返します。};
次のサンプルコードは、サーバーによって返されるメッセージの例を示しています。
説明メッセージは特定の形式ではありません。 ただし、accessid、policy、およびsignatureフィールドをメッセージに含める必要があります。
{"accessid":"LTAI5tAzivUnv4ZF1azP ****" 、"ホスト":"http://post-test.oss-cn-hangzhou.aliyuncs.com" 、"ポリシー":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i ****" 、"signature":"I2u57FWjTKqX/AE6doIdyff1 ****" 、"expire":1446726203、"dir":"user-dir/"}
accessid: リクエストの送信に使用されるAccessKey ID。
host: アップロード要求を送信するドメイン名。
policy: 文字列としてBase64-encodedされるフォームアップロードポリシー。 詳細については、「付録: ポリシー」をご参照ください。
signature: ポリシーに基づいて生成される署名文字列。
expire: アップロードポリシーの有効期限が切れた時点。 このパラメーターの値は、サーバー設定で指定されています。 有効期限が切れる前に、ポリシーを繰り返し使用してオブジェクトをアップロードできます。アップロードごとにサーバーから署名を取得する必要はありません。
説明サーバーの負荷を減らすために、OSSClientインスタンスを初期化してオブジェクトをアップロードするたびに署名を取得できます。 OSSClientインスタンスを使用して別のオブジェクトをアップロードする場合は、現在の時刻と署名の有効期限を比較して、署名の有効期限が切れるかどうかを確認します。 署名の有効期限が切れている場合は、新しい署名を取得するためのリクエストを送信できます。 署名の有効期限が切れていない場合は、署名を使用できます。
次のサンプルコードは、解析されたポリシーの例を示します。
{"expiration":"2015-11-05T20:23:23Z" 、"conditions":[["content-length-range",0,1048576000],// デフォルトでは、アップロードできるオブジェクトの最大サイズは5 GBです。 オブジェクトのサイズ制限を指定できます。 アップロードするオブジェクトがサイズ制限を超えると、エラーが報告されます。 ["starts-with","$key","user-dir/"]]}
上記の例では、ポリシーに追加されたstarts-withフィールドは、オブジェクト名がuser-dirで始まる必要があることを指定しています。 オブジェクトをアップロードするときに、ビジネス要件に基づいてプレフィックスを指定することもできます。 ほとんどのシナリオでは、各アプリケーションがバケットに対応するため、starts-withフィールドがポリシーに追加されます。 データが上書きされないようにするには、OSSにアップロードする各オブジェクトの名前にプレフィックスを指定します。 ユーザーがポリシーを取得した後、ユーザーは複数のオブジェクトをアップロードし、オブジェクトの名前のプレフィックスを変更し、ポリシーが有効な場合にオブジェクトを意図しないディレクトリにアップロードできます。 この問題を解決するには、アプリケーションサーバーのstarts-withフィールドを指定します。 このように、ユーザがポリシーを取得しても、ユーザは、オブジェクトを意図しないディレクトリにアップロードすることができない。 これにより、データのセキュリティが確保されます。
アプリケーションサーバーのURLを設定する
クライアントソースコードの
upload.js
ファイルでは、serverUrl
変数の値を使用してアプリケーションサーバーのURLを設定できます。 アプリケーションサーバーのURLを設定すると、クライアントはGETリクエストをserverUrl
に送信して必要な情報を取得します。// serverUrlは、署名とアップロードポリシーに関する情報を返すアプリケーションサーバーのURLを指定します。 ビジネスシナリオでは、サンプルのIPアドレスとポート番号を実際の値に置き換えます。 serverUrl = 'http:/88.88.XX.XX8:8888 '
よくある質問
一度に複数のオブジェクトをOSSにアップロードするにはどうすればよいですか。
OSSは、一度に複数のオブジェクトをアップロードするためのAPI操作を提供しません。 一度に複数のオブジェクトをOSSにアップロードする場合は、単一のオブジェクトをアップロードする手順を繰り返し実行できます。
サーバーから署名情報を取得してアップロードコールバックを設定するときに、コールバック要求のヘッダーを指定できますか?
いいえ、コールバックリクエストのヘッダーは指定できません。 コールバック要求の本文のみを指定できます。 OSSがコールバックURLを要求するときに使用されるヘッダーを指定することはできません。