ファイルがアップロードされると、OSS は自動的にコールバックをトリガーしてアプリケーションサーバーに通知し、後続の操作を実行させることができます。
制限事項
リージョンの制限
コールバック機能は、次のリージョンでサポートされています:中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、中国 (香港)、米国 (シリコンバレー)、米国 (バージニア)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、ドイツ (フランクフルト)、イギリス (ロンドン)、UAE (ドバイ)。
コールバックの動作
アプリケーションサーバーは、コールバックリクエストに 5 秒以内に応答する必要があります。応答がタイムアウトした場合、コールバックは失敗したと見なされます。
コールバックが失敗しても、ファイルアップロードの成功ステータスには影響しません。
失敗したコールバックは自動的に再試行されません。
インターフェースのサポート
コールバック機能は、PutObject、PostObject、および CompleteMultipartUpload 操作でのみサポートされています。V2 SDK によってカプセル化され、これらの基本操作に基づいているファイルアップロードマネージャーや署名付き URL も、コールバック機能をサポートしています。
コールバックプロセスの概要
OSS のコールバックプロセスは次のとおりです:
クライアントがコールバックパラメーター付きでファイルをアップロードする
ファイルをアップロードする際、クライアントは `callback` パラメーターを含めて、アプリケーションサーバーのアドレスとコールバックの内容を指定する必要があります。カスタム変数を渡すには、`callback-var` パラメーターを含めることもできます。
OSS がファイルを保存し、コールバックリクエストを送信する
ファイルが正常にアップロードされると、OSS は指定されたコールバック URL に POST リクエストを送信します。このリクエストには、バケット、オブジェクト、サイズ、ETag などのファイル情報と、カスタムパラメーターが含まれます。
サーバーがコールバックを処理し、応答を返す
サーバーがコールバックリクエストを受信した後、セキュリティ目的でリクエスト署名を検証できます。サーバーは 5 秒以内にリクエストを処理し、JSON 形式で応答を返す必要があります。HTTP ステータスコード 200 はコールバックが成功したことを示します。その他のステータスコードは、コールバックが失敗したことを示します。
OSS がアップロード結果を返す
OSS がアプリケーションサーバーから成功したコールバック応答を受信した後、OSS は最終的な処理結果をクライアントに返します。
開発ガイド
アップロードコールバックのデバッグには、クライアントのアップロードとサーバー側のコールバック処理の 2 つの部分が含まれます。まずクライアントのアップロードをデバッグし、次にアプリケーションサーバーをデバッグできます。両方の部分がデバッグされた後、完全な統合テストを実行できます。
クライアント側の実装
このセクションでは、アップロードコールバックパラメーターを構築するためのロジックとプロセスについて説明します。アップロードコールバック機能を迅速に実装するには、SDK が提供するサンプルコードをご参照ください。
ファイルがアップロードされた後に OSS が自動的にコールバックをトリガーするようにするには、アップロードリクエストに `callback` パラメーターとオプションの `callback-var` パラメーターを渡す必要があります。
`callback` パラメーターを構築します。
このパラメーターは、アプリケーションサーバーのアドレス、リクエストコンテンツの形式、およびその他の情報を定義します。このパラメーターを JSON 形式で構築し、Base64 エンコードする必要があります。
単純な構成例:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}" }この例では:
callbackUrl:アプリケーションサーバーのアドレス。必要に応じてこの値を変更する必要があります。例:
http://oss-demo.aliyuncs.com:23450。callbackBody:コールバックリクエストボディの内容。プレースホルダーを使用して、アップロード情報を動的に渡すことができます。たとえば、
${bucket}はバケット名を表し、${object}はファイルの完全なパスを表し、${x:xxx}はカスタム変数を参照します。OSS は、コールバック中にこれらのプレースホルダーを実際の値に置き換えます。利用可能なパラメーターの詳細については、「callbackBody でサポートされるシステムパラメーター」をご参照ください。
高度な構成例:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackHost":"oss-cn-hangzhou.aliyuncs.com", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}", "callbackBodyType":"application/x-www-form-urlencoded", "callbackSNI":false }フィールドの詳細については、「コールバックパラメーターの詳細」をご参照ください。
`callback-var` パラメーターを構築します (オプション)。
重要`callback-var` パラメーターは JSON 形式である必要があります。各カスタムパラメーターのキーは `x:` で始まり、小文字のみを含む必要があります (例:
x:uid)。このパラメーターは、ユーザー ID や注文番号などのカスタムビジネス情報をアプリケーションサーバーに渡すために使用されます。例:
{ "x:uid": "12345", "x:order_id": "67890" }`callback-var` パラメーターは `callbackBody` パラメーターと一緒に使用する必要があります。上記の例のユーザー ID (`uid`) と注文番号 (`order_id`) のカスタムパラメーターを参照するには、`callbackBody` で `${x:xxx}` プレースホルダーを使用できます。例:
{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackBody": "uid=${x:uid}&order=${x:order_id}" }コールバック中、OSS は次の内容を送信します。この例では、`callbackBodyType` が `application/x-www-form-urlencoded` に設定されていると仮定します。
uid=12345&order=67890構築後、`callback` および `callback-var` パラメーターを Base64 エンコードします。
例:`callback` パラメーターのエンコーディング
元の `callback` パラメーター:
{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackHost": "your.callback.com", "callbackBody": "bucket=${bucket}&object=${object}&uid=${x:uid}&order=${x:order_id}", "callbackBodyType": "application/x-www-form-urlencoded", "callbackSNI": false }Base64 エンコードされた結果:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9例:`callback-var` パラメーターのエンコーディング
元の `callback-var` パラメーター:
{ "x:uid": "12345", "x:order_id": "67890" }Base64 エンコードされた結果:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
エンコードされたパラメーターをリクエストにアタッチします。
パラメーターをエンコードした後、次のいずれかの方法で OSS に渡すことができます。
ヘッダーでパラメーターを渡す (推奨)
この方法は、SDK またはバックエンドコードを使用してオブジェクトをアップロードするのに適しています。この方法は高いセキュリティを提供し、推奨されます。`x-oss-callback` および `x-oss-callback-var` HTTP ヘッダーを設定して、コールバックパラメーターを渡すことができます。
x-oss-callback:Base64 エンコードされた `callback` パラメーター。
x-oss-callback-var (オプション):Base64 エンコードされた `callback-var` パラメーター。
注:リクエスト署名を計算する際、リクエストの有効性を確保するために、これら 2 つのパラメーターを正規化ヘッダーに含める必要があります。
例:ヘッダーでコールバックパラメーターを渡す
PUT /your_object HTTP/1.1 Host: callback-test.oss-test.aliyun-inc.com Accept-Encoding: identity Content-Length: 5 x-oss-callback-var: eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0= User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4) x-oss-callback: eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 Host: callback-test.oss-test.aliyun-inc.com Expect: 100-Continue Date: Wed, 26 Apr 2023 03:46:17 GMT Content-Type: text/plain Authorization: OSS qn6q**************:77Dv**************** TestPOST リクエストボディのフォームフィールドを使用してパラメーターを渡す
この方法は、PostObject 操作にのみ適用されます。POST リクエストボディのフォームフィールドを介してのみコールバックパラメーターを渡すことができます。
`callback` パラメーター:このパラメーターは、別のフォーム項目として渡すことができます。値は Base64 エンコードされた JSON 構成です。
--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9`callback-var` パラメーター (カスタムパラメーター):各カスタムフィールドは、別のフォーム項目として渡す必要があります。カスタムフィールドを単一の `callback-var` フィールドにカプセル化しないでください。
たとえば、カスタムパラメーター `uid` と `order_id` の場合:
{ "x:uid": "12345", "x:order_id": "67890" }これらをフォーム内の 2 つの別々のフィールドに変換する必要があります。
--9431149156168 Content-Disposition: form-data; name="x:uid" 12345 --9431149156168 Content-Disposition: form-data; name="x:order_id" 67890`callback` パラメーターの検証 (オプション):ポリシーで `callback` パラメーターの検証条件を指定できます。検証条件を設定しない場合、アップロード中にパラメーターは検証されません。例:
{ "expiration": "2021-12-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"}, ["starts-with", "$key", "user/eric/"] ] }
URL でパラメーターを渡す
この方法は、一般的に署名付き URL を使用してファイルをアップロードするために使用されます。この方法は、コールバックパラメーターを Base64 エンコードして URL に追加することで、自動コールバックを実装します。ただし、コールバック情報が URL に公開されるため、この方法にはセキュリティリスクが伴います。この方法は、一時的なアクセスやセキュリティ要件が低いシナリオでのみ使用することを推奨します。
URL でコールバックパラメーターを渡すことを選択した場合、
callbackパラメーターを含める必要があります。callback-varパラメーターはオプションです。署名を計算する際、これらのパラメーターは正規化クエリ文字列に含める必要があります。詳細については、「署名バージョン 4」をご参照ください。例:
PUT /your_object?OSSAccessKeyId=LTAI******************&Signature=vjby*************************************&Expires=1682484377&callback-var=eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=&callback=eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 HTTP/1.1 Host: callback-test.oss-cn-hangzhou.aliyuncs.com Date: Wed, 26 Apr 2023 03:46:17 GMT Content-Length: 5 Content-Type: text/plain
サーバー側の実装
このセクションでは、サーバー側の処理フローについて説明します。さまざまな言語でのコード例については、「サーバー側のコード例」をご参照ください。
アプリケーションサーバーは、次の機能をサポートする必要があります:
OSS からの POST リクエストを受信する
ファイルが正常にアップロードされると、OSS はコールバックパラメーターに基づいて、設定されたアプリケーションサーバーに自動的に POST リクエストを送信します。例:
POST /test HTTP/1.1 Host: your.callback.com Connection: close Authorization: GevnM3**********3j7AKluzWnubHSVWI4dY3VsIfUHYWnyw== Content-MD5: iKU/O/JB***ZMd8Ftg== Content-Type: application/x-www-form-urlencoded Date: Tue, 07 May 2024 03:06:13 GMT User-Agent: aliyun-oss-callback x-oss-bucket: your_bucket x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVi**********vY2FsbGJeV92MS5wZW0= x-oss-request-id: 66399AA50*****3334673EC2 x-oss-requester: 23313******948342006 x-oss-signature-version: 1.0 x-oss-tag: CALLBACK bucket=your_bucket&object=your_object&uid=12345&order_id=67890セキュリティのためにリクエスト署名を検証する (オプション)
コールバックリクエストが OSS からのものであることを確認するために、アプリケーションサーバーで署名を検証します。検証手順については、「推奨構成」をご参照ください。
説明署名検証はオプションです。必要に応じて有効にできます。
コールバック応答を返す
アプリケーションサーバーがコールバックリクエストを受信した後、OSS に応答を返す必要があります。コールバック応答は、次の要件を満たす必要があります:
アプリケーションサーバーは、`HTTP/1.1 200 OK` ステータスコードで応答を返す必要があります。
応答ヘッダーには `Content-Length` を含める必要があります。
応答ボディは JSON または XML 形式にすることができます。この例では JSON 形式を使用します。応答ボディに XML 形式を使用するには、応答ヘッダーに
Content-Type: application/xmlを追加する必要があります。
たとえば、アプリケーションサーバーは `{"Status": "OK"}` を返します。
注:この例では Python 2.7.6 を使用しています。実際の開発では、Python 3 を使用する必要があります。
HTTP/1.0 200 OK Server: BaseHTTP/0.3 Python/2.7.6 Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: application/json Content-Length: 9 {"Status": "OK"}その後、OSS はこの応答内容をクライアントに渡します。例:
HTTP/1.1 200 OK Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: application/json Content-Length: 9 Connection: keep-alive ETag: "D8E8FCA2DC0F896FD7CB4CB0031BA249" Server: AliyunOSS x-oss-bucket-version: 1442231779 x-oss-request-id: 55F6BF87207FB30F2640C548 {"Status": "OK"}重要CompleteMultipartUploadリクエストの場合、元の応答ボディに JSON 形式の情報などのコンテンツが含まれていると、アップロードコールバックを有効にすると、このコンテンツがコールバックから返されたコンテンツ (例:{"Status": "OK"}) で上書きされます。
推奨構成
セキュリティのためのリクエスト署名検証
コールバックパラメーターを設定した後、OSS は `callbackUrl` パラメーターに基づいて、設定されたアプリケーションサーバーに POST コールバックリクエストを送信します。リクエストが OSS からのものであることを確認するために、コールバックリクエストの署名を検証できます。次のセクションでは、検証手順を詳しく説明します。
クライアント側の署名生成 (OSS が実行)
OSS は、RSA 非対称暗号化アルゴリズムと MD5 ハッシュアルゴリズムを使用してリクエストコンテンツの署名を生成し、その署名をリクエストヘッダーの `authorization` フィールドに追加します。
署名は次のように計算されます:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))説明この数式では、`private_key` は秘密鍵、`path` はコールバックリクエストのリソースパス、`query_string` はクエリ文字列、`body` はコールバックメッセージボディです。
署名を生成する方法は次のとおりです:
署名対象文字列を作成します。この文字列は、URL をデコードして得られるリソースパス、元のクエリ文字列、改行、およびコールバックメッセージボディで構成されます。
作成した文字列を、RSA 暗号化アルゴリズムと秘密鍵を使用して署名します。署名の計算に使用されるハッシュ関数は MD5 です。
署名された文字列を Base64 エンコードして最終的な署名を取得します。次に、その署名をコールバックリクエストの `Authorization` ヘッダーに追加します。
署名生成の例:
POST /index.php?id=1&index=2 HTTP/1.0 Host: 172.16.XX.XX Connection: close Content-Length: 18 authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZj****/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t**** Content-Type: application/x-www-form-urlencoded User-Agent: http-client/0.0.1 x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnsr**** bucket=examplebucket最終的な署名
kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****は、パス/index.php、クエリ文字列?id=1&index=2、およびボディbucket=examplebucketから生成されます。
コールバックサーバーが署名を検証する
アプリケーションサーバーは、リクエストソースの正当性を確認するために、OSS からのリクエストの署名を検証する必要があります。次の手順に従うことができます:
公開鍵を取得する:
リクエストヘッダーの `x-oss-pub-key-url` フィールドから Base64 エンコードされた公開鍵 URL を取得し、その URL をデコードします。
public_key = urlopen(base64_decode(x-oss-pub-key-url header value))デコード前の値の例:
aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==デコード後:
http://gosspublic.alicdn.com/callback_pub_key_v1.pem説明公開鍵 URL は
http://gosspublic.alicdn.com/またはhttps://gosspublic.alicdn.com/で始まる必要があります。公開鍵 URL の内容は変更されません。ネットワークの変動によるサービス中断を防ぐために、公開鍵をキャッシュすることを推奨します。署名をデコードする。
リクエストヘッダーの `authorization` フィールドから署名を取得し、その署名を Base64 デコードします。
signature = base64_decode(authorization header value)検証用の文字列を構築する。
リソースパス、クエリ文字列、改行、およびコールバックメッセージボディを次の形式で連結できます:
sign_str = url_decode(path) + query_string + '\n' + body署名検証を実行する。
MD5 ハッシュアルゴリズムと RSA 公開鍵を使用して署名を検証できます。
result = rsa_verify(public_key, md5(sign_str), signature)
署名検証の例
次の Python 3 コードは、アプリケーションサーバーで署名を検証する方法の例を示しています。この例には M2Crypto ライブラリが必要です。
import http.client import base64 import hashlib import urllib.request import urllib.parse import socket from http.server import BaseHTTPRequestHandler, HTTPServer from M2Crypto import RSA from M2Crypto import BIO def get_local_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr except socket.error: return "" class MyHTTPRequestHandler(BaseHTTPRequestHandler): ''' def log_message(self, format, *args): return ''' def do_POST(self): # 公開鍵を取得します。 pub_key_url = '' try: pub_key_url_base64 = self.headers['x-oss-pub-key-url'] pub_key_url = base64.b64decode(pub_key_url_base64).decode() if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"): self.send_response(400) self.end_headers() return url_reader = urllib.request.urlopen(pub_key_url) # 公開鍵アドレスに基づいて公開鍵の内容をキャッシュします。 pub_key = url_reader.read() except Exception as e: print('pub_key_url : ' + pub_key_url) print('Get pub key failed! Error:', str(e)) self.send_response(400) self.end_headers() return # 権限付与を取得します。 authorization_base64 = self.headers['authorization'] authorization = base64.b64decode(authorization_base64) # コールバックボディを取得します。 content_length = self.headers['content-length'] callback_body = self.rfile.read(int(content_length)) # 権限付与文字列を構成します。 auth_str = '' pos = self.path.find('?') if -1 == pos: auth_str = urllib.parse.unquote(self.path) + '\n' + callback_body.decode() else: auth_str = urllib.parse.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body.decode() print(auth_str) # 権限付与を検証します。 auth_md5 = hashlib.md5(auth_str.encode()).digest() bio = BIO.MemoryBuffer(pub_key) rsa_pub = RSA.load_pub_key_bio(bio) try: result = rsa_pub.verify(auth_md5, authorization, 'md5') except: result = False if not result: print('Authorization verify failed!') print('Public key : %s' % (pub_key)) print('Auth string : %s' % (auth_str)) self.send_response(400) self.end_headers() return # callback_body に基づいて何かを実行します。 # OSS に応答します。 resp_body = '{"Status":"OK"}' self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', str(len(resp_body))) self.end_headers() self.wfile.write(resp_body.encode()) class MyHTTPServer(HTTPServer): def __init__(self, host, port): super().__init__((host, port), MyHTTPRequestHandler) if __name__ == '__main__': server_ip = get_local_ip() server_port = 23451 server = MyHTTPServer(server_ip, server_port) server.serve_forever()他のプログラミング言語でのサーバー側コード例については、次の表をご参照ください。
SDK 言語
説明
Java
ダウンロードリンク:Java
実行方法:パッケージを解凍し、
java -jar oss-callback-server-demo.jar 9000を実行します。9000 は別のポート番号に置き換えることができます。
Python
ダウンロードリンク:Python
実行方法:パッケージを解凍し、
python callback_app_server.pyを実行します。このプログラムには RSA の依存関係が必要です。
PHP
ダウンロードリンク:PHP
実行方法:Apache 環境にデプロイします。PHP では、一部のヘッダーの取得は環境に依存します。ご利用の環境に合わせてサンプルコードを修正してください。
.NET
ダウンロードリンク:.NET
実行方法:パッケージを解凍し、
README.mdの指示に従ってください。
Node.js
ダウンロードリンク:Node.js
実行方法:パッケージを解凍し、
node example.jsを実行します。
Ruby
ダウンロードリンク:Ruby
実行方法:ruby aliyun_oss_callback_server.rb を実行します
コールバックパラメーターの詳細
次の表は、ファイルが OSS に正常にアップロードされた後のコールバックリクエストの内容と動作を設定するために使用される `callback` パラメーターの詳細な説明を提供します。
フィールド | 必須 | 説明 |
callbackUrl | はい | ファイルアップロードが成功した後、OSS はこの URL に POST コールバックリクエストを送信します。
|
callbackBody | はい | コールバックを開始する際のリクエストボディの内容。その形式は `callbackType` パラメーターと一致する必要があります:
`callbackBody` は、OSS システムパラメーター、カスタム変数、および定数の参照をサポートしています。システムパラメーターの説明については、「callbackBody でサポートされるシステムパラメーター」をご参照ください。 |
callbackHost | いいえ | コールバックリクエストを開始する際の Host ヘッダーの値。形式はドメイン名または IP アドレスです。
|
callbackSNI | いいえ | コールバックリクエストに SNI (サーバー名表示) を含めるかどうか (HTTPS リクエストでドメインを識別し、正しい証明書を返すために使用されます)。 `callbackUrl` が HTTPS を使用する場合、このパラメーターを有効にします。そうしないと、証明書の不一致によりコールバックが失敗する可能性があります (例:「502 callback failed」エラー)。値は次のとおりです:
|
callbackBodyType | いいえ | コールバックリクエストの Content-Type の値。これは 次の 2 つのタイプをサポートしています:
|
callbackBody でサポートされるシステムパラメーター
`callback` パラメーターの `callbackBody` フィールドは、コールバックリクエストでアップロードされたファイルに関する情報を渡すために参照できる複数のシステムパラメーターをサポートしています。サポートされているシステムパラメーターは次の表にリストされています。
システムパラメーター | 意味 |
bucket | バケット名。 |
object | オブジェクト (ファイル) の完全なパス。 |
etag | ファイルの ETag。ユーザーに返される ETag フィールドです。 |
size | オブジェクトのサイズ。`CompleteMultipartUpload` を呼び出すとき、`size` はオブジェクト全体のサイズです。 |
mimeType | リソースタイプ。たとえば、JPEG イメージのリソースタイプは `image/jpeg` です。 |
imageInfo.height | イメージの高さ。この変数はイメージ形式にのみ適用されます。イメージ形式以外の場合、この変数の値は空です。 |
imageInfo.width | イメージの幅。この変数はイメージ形式にのみ適用されます。イメージ形式以外の場合、この変数の値は空です。 |
imageInfo.format | JPG や PNG などのイメージ形式。この変数はイメージ形式にのみ適用されます。イメージ形式以外の場合、この変数の値は空です。 |
crc64 | ファイルアップロード後に返される `x-oss-hash-crc64ecma` ヘッダーの内容と一致します。 |
contentMd5 | MD5 値。このパラメーターの値は、オブジェクトがアップロードされた後に返される Content-MD5 ヘッダーの値と同じです。 重要 この変数は、PutObject または PostObject 操作を呼び出してオブジェクトをアップロードした場合にのみ値を持ちます。 |
vpcId | リクエストを開始したクライアントの `VpcId`。リクエストが VPC 経由で開始されていない場合、この変数の値は空です。 |
clientIp | リクエストを開始したクライアントの IP アドレス。 |
reqId | 開始されたリクエストの `RequestId`。 |
operation | `PutObject` や `PostObject` など、リクエストを開始した操作の名前。 |
SDK
以下は、クライアント実装の例です。
単純なアップロード (PutObject を使用) | マルチパートアップロード (CompleteMultipartUpload を使用) | 署名付き URL アップロード (PutObject を使用) | |
Java | |||
Python V2 | - | ||
Go V2 |
トラブルシューティング
OSS のエラーメッセージには EC エラーコードが含まれています。コールバックプロセス中にエラーが発生した場合、EC コードを使用してトラブルシューティングを行うことができます。各 EC コードは、エラーの特定の原因に対応しています。コールバックに関連する EC エラーコードの詳細については、「07-CALLBACK」をご参照ください。
よくある質問
アップロード失敗後、OSS はアプリケーションサーバーにコールバック通知を送信しますか?
いいえ。OSS はファイルが正常にアップロードされた後にのみコールバックを実行します。ファイルのアップロードが失敗した場合、OSS はコールバックを実行せず、代わりにエラーメッセージを返します。
「Response body is not valid json format」エラーの対処法
処理中にアプリケーションサーバーが例外をスローします。これにより、OSS に返されるボディが JSON 形式ではなくなります。次の図に示します:

解決策:
次のコマンドを実行して内容を確認できます。
curl -d "<Content>" <CallbackServerURL> -vパケットをキャプチャして内容を確認できます。
Windows では、Wireshark を使用してパケットをキャプチャできます。Linux では、tcpdump コマンドを実行できます。
アプリケーションサーバーから OSS に返されるボディにバイトオーダーマーク (BOM) ヘッダーが含まれています。
このエラーは、PHP SDK を使用して記述されたアプリケーションサーバーでよく発生します。PHP SDK は BOM ヘッダーを返すため、OSS が受信するボディには 3 バイト余分に含まれます。これにより、ボディが JSON 形式ではなくなります。次の図に示すように、`ef bb bf` バイトが BOM ヘッダーを構成します。

解決策:アプリケーションサーバーから OSS に返されるボディから BOM ヘッダーを削除します。