このトピックでは、POSTポリシーに基づいてアプリケーションサーバーから署名情報を取得し、アップロードコールバックを設定してから、フォームアップロードを使用してさまざまなプログラミング言語でObject Storage Service (OSS) にデータをアップロードする方法について説明します。
背景情報
オブジェクトをOSSにアップロードする場合、アップロードタスクに関する情報とオブジェクトの名前をアプリケーションサーバーに送信する必要があります。 画像をOSSにアップロードするときは、画像のサイズに関する情報をアプリケーションサーバーに送信する必要があります。 上記の要件を満たすために、OSSはアップロードコールバック機能を提供します。
処理中
ユーザーがオブジェクトをOSSにアップロードするときにアプリケーションサーバーにアップロードコールバック要求を受信させたい場合は、OSSがアップロードコールバック要求をアプリケーションサーバーに送信するようにコールバック関数を設定します。 ユーザーがオブジェクトをアップロードすると、アプリケーションサーバーはアップロードコールバック要求に対する応答をOSSに返します。 その後、OSSは応答をユーザーに転送します。 この応答はアップロード結果です。
例
プロセス分析
次のプロセスでは、使用されるコアコードと返されるメッセージについて説明します。
ユーザーがアプリケーションサーバーにリクエストを送信して、アップロードポリシーとコールバック設定を取得します。
クライアントソースコードの
upload.js
ファイルでは、serverUrl
変数の値を使用してアプリケーションサーバーのURLを設定できます。 アプリケーションサーバーのURLを設定すると、クライアントはserverUrl
で指定されたパスにGETリクエストを送信し、必要な情報を取得します。// serverUrl specifies the URL of the application server that returns information about the signature and upload policy. Replace the sample IP address and port number with your actual information. serverUrl = 'http:/88.88.XX.XXX:8888';
アプリケーションサーバーは、アップロードポリシーと、アップロードコールバックを構成するために使用されるコードをユーザーに返します。
アプリケーションサーバは、直接データ転送のためにクライアントから送信されるGET要求を処理する。 対応するコードを変更して、アプリケーションサーバーがクライアントに正しいメッセージを返すようにすることができます。 さまざまなプログラミング言語の設定ドキュメントには、参照用の明確な指示があります。
次のサンプルコードは、クライアントに返されるメッセージ本文の例を示しています。 メッセージ本文は、クライアントからオブジェクトをアップロードするために重要です。
{ "accessid":"LTAI**********", "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com", "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i****", "signature":"I2u5**********", "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, // Set the HTTP status code that is returned by the application server to 200. If you do not configure this parameter, the HTTP status code 204 is returned. 'success_action_status' : '200', 'callback': callbackbody, 'signature': signature, };
OSSは、コールバック設定に基づいてコールバック要求をアプリケーションサーバーに送信します。
オブジェクトをOSSにアップロードした後、OSSはクライアントのアップロードコールバック設定を解析し、POSTコールバック要求をアプリケーションサーバーに送信します。 次のサンプルコードは、リクエストメッセージの内容を示しています。
説明この例では、V1署名が使用される。 V4署名を使用してリクエストを送信する場合は、「V1署名をV4署名にアップグレードするためのガイドライン」をご参照ください。
Hypertext Transfer Protocol POST / HTTP/1.1\r\n Host47.97.XXX.XX53\r\n Connection: close\r\n Content-Length: 76\r\n Authorization: fsNx********//a8x6v2lI1********\r\n Content-MD5: eiEMyp7lbL8KStPBzMdr9w==\r\n Content-Type: application/x-www-form-urlencoded\r\n Date: Sat, 15 Sep 2018 10:24:12 GMT\r\n User-Agent: 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 [Full request URI: http://47.xx.xx.53/] [HTTP request 1/1] [Response in frame: 39] File Data: 76 bytes HTML Form URL Encoded: application/x-www-form-urlencoded Form item: "filename" = ".snappython.png" Form item: "size" = "6014" Form item: "mimeType" = "image/png" Form item: "height" = "221"
アプリケーションサーバーがOSSに応答を返します。
アプリケーションサーバーは、OSSによって送信されたメッセージに含まれる
承認
ヘッダーに基づいて署名を検証します。 検証が成功すると、アプリケーションサーバーは次のメッセージをJSON形式でOSSに返します。{ "String value": "ok", "Key": "Status" }
OSSは、アプリケーションサーバーからユーザーに応答を転送します。
クライアントのソースコードの解析
クライアントソースコードをダウンロードするには、aliyun-oss-appserver-js-master.zipをクリックします。
Pluploadは、クライアントのJavaScriptコードに使用されます。 Pluploadは、ファイルをアップロードできるシンプルで使いやすい強力なツールです。 このツールは、HTML、Flash、Silverlight、およびHTML5を使用したアップロードを含む、複数のアップロード方法をサポートしています。 Pluploadは現在の環境を検出し、最適なアップロード方法を選択します。 このツールは、アップロードのために最も高い優先順位をHTML5に割り当てます。 Pluploadの詳細については、Plupload.comをご覧ください。
次のサンプルコードでは、一般的な機能について説明します。
アップロードするオブジェクトにランダムな名前を指定する
拡張子を変更せずにランダムなオブジェクト名を指定する場合は、次のコードを使用して関数を変更できます。
function check_object_radio() { g_object_name_type = 'random_name'; }
元のオブジェクト名を保持する
元のオブジェクト名を保持する場合は、次のコードを使用して関数を変更できます。
function 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 : [ // Specify that only images and ZIP objects can be uploaded. { title : "Image files", extensions : "jpg,gif,png,bmp" }, { title : "Zip files", extensions : "zip" } ], // Specify that only objects that are smaller than 400 KB in size can be uploaded. max_file_size : '400kb', // Specify that the repeat upload of an object is denied. prevent_duplicates : true },
mime_types: アップロードするオブジェクトの名前拡張子。
max_file_size: アップロードするオブジェクトの最大サイズ。
prevent_duplicates: オブジェクトを繰り返しアップロードできるかどうかを指定します。
アップロードされたオブジェクトの名前の取得
Pluploadを使用してFileUploadedイベントを呼び出すことで、アップロードされたオブジェクトの名前を取得できます。
FileUploaded: function(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変数を取得できます。
function get_signature() { // Determine whether the value of the expire parameter exceeds the current time. If the value exceeds the current time, you must request a new signature. The signature is returned after three seconds. 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; } return false; };
次のサンプルコードは、サーバーによって返されるメッセージの例を示しています。
説明メッセージは特定の形式ではありません。 ただし、accessid、policy、およびsignatureフィールドをメッセージに含める必要があります。
{"accessid":"LTAI**********", "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com", "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i****", "signature":"I2u5**********", "expire":1446726203,"dir":"user-dir/"}
accessid: リクエストの送信に使用されるAccessKey ID。
host: アップロード要求を送信するドメイン名。
policy: 文字列としてBase64-encodedされるフォームアップロードポリシー。 詳細は、「Post ポリシー」をご参照ください。
signature: ポリシーに基づいて生成される署名文字列。
expire: アップロードポリシーの有効期限が切れた時点。 このパラメーターの値は、サーバー設定で指定されています。 アップロードポリシーの有効期限が切れる前に、ポリシーを繰り返し使用してオブジェクトをアップロードできます。アップロードごとにサーバーから署名を取得する必要はありません。
説明サーバーの負荷を減らすために、OSSClientインスタンスを初期化してオブジェクトをアップロードするたびに署名を取得できます。 OSSClientインスタンスを使用して別のオブジェクトをアップロードする場合は、現在の時刻と署名の有効期限を比較して、署名の有効期限が切れるかどうかを確認します。 署名の有効期限が切れた場合は、新しい署名を取得するためのリクエストを送信できます。 署名の有効期限が切れていない場合は、既存の署名を使用できます。
次のサンプルコードは、解析されたポリシーの例を示します。
{"expiration":"2015-11-05T20:23:23Z", "conditions":[["content-length-range",0,1048576000],// By default, the maximum size of the object that you can upload is 5 GB. You can specify a size limit for the object. If the object that you want to upload exceeds the size limit, OSS reports an error. ["starts-with","$key","user-dir/"]]}
上記の例では、ポリシーに追加されたstarts-withフィールドは、オブジェクト名がuser-dirで始まる必要があることを指定しています。 オブジェクトをアップロードするときに、ビジネス要件に基づいてプレフィックスを指定することもできます。 ほとんどのシナリオでは、各アプリケーションがバケットに対応するため、starts-withフィールドがポリシーに追加されます。 データが上書きされないようにするには、OSSにアップロードする各オブジェクトの名前にプレフィックスを指定します。 ユーザーがポリシーを取得した後、ユーザーは複数のオブジェクトをアップロードし、オブジェクトの名前のプレフィックスを変更し、ポリシーが有効な場合にオブジェクトを意図しないディレクトリにアップロードできます。 この問題を解決するには、アプリケーションサーバーのstarts-withフィールドを指定します。 このように、ユーザがポリシーを取得しても、ユーザは、オブジェクトを意図しないディレクトリにアップロードすることができない。 これにより、データのセキュリティが確保されます。
アプリケーションサーバーのURLの設定
クライアントソースコードの
upload.js
ファイルでは、serverUrl
変数の値を使用してアプリケーションサーバーのURLを設定できます。 アプリケーションサーバーのURLを設定すると、クライアントはGETリクエストをserverUrl
に送信して必要な情報を取得します。// serverUrl specifies the URL of the application server that returns information about the signature and upload policy. Replace the sample IP address and port number with your actual IP address and port number. serverUrl = 'http:/88.88.XX.XX8:8888'
よくある質問
一度に複数のオブジェクトをOSSにアップロードするにはどうすればよいですか。
OSSは、一度に複数のオブジェクトをアップロードするためのAPI操作を提供しません。 一度に複数のオブジェクトをOSSにアップロードする場合は、単一のオブジェクトをアップロードする手順を繰り返し実行できます。
サーバーから署名情報を取得してアップロードコールバックを設定するときに、コールバック要求のヘッダーを指定できますか?
いいえ、コールバックリクエストのヘッダーは指定できません。 カスタムコールバックパラメータ、つまりコールバック要求の本文のみを指定できます。 ただし、OSSコールバックリクエストによってコールバックURLに伝達されるヘッダーを指定することはできません。