背景

背景情報については、「Web クライアントの直接データ転送」をご参照ください。

サーバーに署名を追加した後の直接転送の使用方法にはいくつかの問題があります。 ユーザーがデータをアップロードしたら、ユーザーがアップロードしたファイル、ファイル名、画像サイズ (画像がアップロードされている場合) などを使用し、アプリケーションサーバーを更新する必要があります。 したがって、アップロードコールバック関数は OSS 用に開発されています。

  • ユーザー要求ロジック
    1. ユーザーは、アプリケーションサーバーからアップロードポリシーとコールバック設定を取得します。
    2. アプリケーションサーバーはアップロードポリシーとコールバック設定を返します。
    3. ユーザーはファイルのアップロード要求を直接 OSS に送信します。
    4. ファイルデータがアップロードされ、OSS からユーザーに応答が送信される前に、OSS はユーザーのコールバック設定に基づき、ユーザーのサーバーに要求を送信します。
    5. サーバーが成功を返した場合、OSS は成功をユーザーに返します。 サーバーが失敗を返した場合、OSS は失敗をユーザーに返します。 これにより、ユーザーが正常にアップロードしたすべてのイメージがアプリケーションサーバーに確実に通知されます。
    6. アプリケーションサーバーは OSS に情報を返します。
    7. OSS はアプリケーションサーバーから返された情報をユーザーに返します。

    つまり、ユーザーはファイルを OSS サーバーにアップロードする必要があります。 また、アップロードが完了すると、ユーザーのアプリケーションサーバーに完了したことが通知されます。 この場合、コールバック関数を設定し、ユーザーのアプリケーションサーバーを更新する必要があります。 このため、OSS はユーザーのアップロード要求を受け取るとアップロードを開始します。 アップロードした直後に結果がユーザーに返されることはありませんが、まず、ユーザーのアプリケーションサーバーに、"アップロードが完了しました" などのシステムで生成されたメッセージが通知されます。その後、アプリケーションサーバーは OSS に “アップロードファイルを受信しました。所有者にこの情報を伝えてください” というメッセージを通知します。 これらの通知を送信した後、OSS は結果をユーザーに転送します。

  • 例しますしますしますします

    ユーザーのコンピュータブラウザーのサンプルテスト: アップロードコールバックの例を見るには、こちらをクリックします。

    アップロードが有効かどうかをテストするため、ユーザーの電話を使用します。 携帯電話 (WeChat、QQ、モバイルブラウザーなど) を使用し、QRコードをスキャンします (これは宣伝ではありません。上記 URL の QR コードです。この操作により、サービスがきちんと機能しているかどうかを確認します)。

  • コードのダウンロード

    コードをダウンロードするには、こちらをクリックします。

    この例ではバックエンド署名を採用し、PHP 言語を使用しています。

    • Java 言語を使用したバックエンド署名の例については、こちらをクリックします。
    • Go 言語を使用したバックエンド署名の例については、こちらをクリックします。
    • Python 言語を使用したバックエンド署名の例については、こちらをクリックします。

    他の言語の使用方法:

    1. 対応する言語のサンプルをダウンロードします。
    2. コードサンプルを変更します。たとえば、リスニングポートを設定して実行を開始します。
    3. oss-h5-upload-js-php-callback.zip の upload.js で、変数 severUrl をステップ 2 で設定したアドレスに変更します。 たとえば、severUrl = http://1.2.3.4:8080 または http://abc.com/post/ です。
  • クイックスタートガイド

    手順に従って、Web ページを介してファイルを OSS にアップロードします。OSS はコールバック通知をユーザーが設定したアプリケーションサーバーに送信します。

    1. 自分の ID、キー、バケットを設定します。

      設定方法: php/get.php を変更し、変数 $id を AccessKeyId に、$key を AccessKeySecret に、そして $host をバケット + エンドポイントにします。

      $id= 'xxxxxx';
       $key= 'xxxxx';
       $host = 'http://post-test.oss-cn-hangzhou.aliyuncs.com
    2. ブラウジングのセキュリティを保証するため、CORS をバケットに設定する必要があります。
    3. 自分専用のコールバック URL を設定します。 つまり、自分専用のコールバックサーバーアドレスです。 URL の例: http://abc.com/test.html (公衆ネットワーク経由でのアクセスが可能)。 ファイルがアップロードされた後、OSS はあなたが設定したコールバック URL (http://abc.com/test.html) を介して、ファイルアップロード情報をアプリケーションサーバーに送信します。 設定方法: php/get.php を変更します (このコールバックサーバーのコードインスタンスについては、次の内容ご参照ください)。
      $callbackUrl = "http://abc.com/test.html";

      署名のアップロードやランダムなファイル名の設定などのアップロードに関する詳細については、こちらをクリックします。

  • コアコード分析
    次の内容をコードに追加します。
    new_multipart_params = {
         'key' : key + '${filename}',
         'policy': policyBase64,
         'OSSAccessKeyId': accessid,
         'success_action_status' : '200', //Instructs the server to return 200. Otherwise, the server returns 204 by default.
         'callback':  callbackbody,
         'signature': signature, 
     };

    上記のコールバック本体は PHP サーバーによって返されます。 この例では、バックエンドで PHP スクリプトを実行すると次の内容が得られます。 backend:

    {"accessid":"6MKOqxGiGU4AUk44",
    "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
    "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
    "signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=",
    "expire":1446727949,
    "callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dirs/"}

    上記のコールバック本体は、返された結果に含まれる Base64 エンコードのコールバックコンテンツです。

    デコードされたコンテンツは以下のとおりです。

    {"callbackUrl":"http://oss-demo.aliyuncs.com:23450",
    "callbackHost":"oss-demo.aliyuncs.com",
    "callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
    "callbackBodyType":"application/x-www-form-urlencoded"}

    内容分析:

    • callbackUrl: OSS によってこのホストに送信された URL 要求を指定します。
    • callbackHost: この要求が OSS によって送信されるときに要求ヘッダーに含める ホストヘッダーを指定します。
    • callbackBody: OSS 要求時にアプリケーションサーバーに送信されるコンテンツを指定します。 ファイル名、ファイルのサイズ、タイプ、画像、およびそのサイズ(ファイルがある場合) が含まれます。
    • callbackBodyType: 送信を要求された Content-Type を指定します。
  • コールバックアプリケーションサーバー

    OSS がアプリケーションサーバーと相互に影響を与える時、ステップ 4 と 5 はユーザーの要求ロジックにおいて重要です。 以下は、ご質問に対する回答と説明です。

    • 質問: 私が開発者である場合、要求が OSS から送信されたことはどのように確認できますか。

      回答: OSS が要求を送信すると、アプリケーションサーバーとの間で署名が作成されます。 どちらもセキュリティを保証するために署名を使用します。

    • 質問: 署名はどのように作成されますか。サンプルコードはありますか。

      回答: はい。上記の例は、アプリケーションサーバーコールバックのサンプルコードです。: http://oss-demo.aliyuncs.com:23450 (現在は Linux のみサポートされています)。

      上記のコードは、次のように実行されます。callback_app_server.py.zip

      解決策の実行: Linux システムで python callback_app_server.py ファイルを直接実行します。

      プログラムは自動的にシンプルな http サーバーを実装します。 このプログラムを実行するには、RSA が依存するシステム環境をインストールする必要があります。

    • 質問: アプリケーションサーバーが受信したコールバック要求に Authorization ヘッダーがないのはなぜですか。

      回答: apache2 のように、Web サーバーには Authorization ヘッダーを自動的に解決するものがあります。 そのため、このヘッダーを解決しないように設定されています。例として、apache2 を使用した場合の具体的な設定方法は次のとおりです。

      1. 書き換えモジュールを起動し、コマンド a2enmod rewrite を実行します。
      2. 設定ファイル /etc/apache2/apache2.conf を変更します (これは apache2 のインストールパスによって異なります)。 [上書きをすべてに対して許可] に設定し、次の内容を追加します。
        RewriteEngine on         
        RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

    サンプルプログラムは、アプリケーションサーバーが受信する署名を確認する方法を示しています。 アプリケーションサーバーが受信したコールバックコンテンツの形式を解析するため、コードを追加する必要があります。

    他の言語のコールバックアプリケーションサーバーのバージョン
    • Java のバージョン
      • ダウンロードアドレス: こちらをクリック
      • 実行方法: アーカイブを抽出し、java -jar oss-callback-server-demo.jar 9000 を実行します(9000 はポート番号であり、必要に応じて変更できます)。
        この jar ファイルは java 1.7 で動作します。 何らかの問題が発生した場合、提供されたコードに基づいて変更を加えることができます。 これは maven プロジェクトです。
    • PHP バージョン
      • ダウンロードアドレス: こちらをクリック
      • 実行方法: Apache 環境にプログラムを配置します。 PHP 言語の特性上、ヘッダーの取得は環境に依存します。 自分の環境に基づき、サンプルに変更を加えることができます。
    • Python バージョン:
      • ダウンロードアドレス: こちらをクリック
      • 実行方法: アーカイブを展開して python callback_app_server.py を直接実行します。 プログラムはシンプルな HTTP サーバーを実装しています。 このプログラムを実行するには、RSA が依存するシステム環境をインストールする必要があります。
    • Ruby バージョン:

まとめ

  • 例 1: JavaScript クライアントに直接署名を追加し、その形式のファイルを直接 OSS にアップロードする方法を説明しています。 oss-h5-upload-js-direct.tar.gz
  • 例 2: PHP スクリプトを使用してバックエンドから署名を取得した後、そのファイルをフォームで OSS に直接アップロードする方法を説明しています。oss-h5-upload-js-php.tar.gz
  • 例 3: PHP スクリプトを使用してバックエンドから署名を取得し、アップロード後にコールバックを実行してからフォームを直接 OSS にアップロードする方法を説明しています。 続いて、OSS はアプリケーションサーバーをコールバックし、その結果をユーザーに返します。oss-h5-upload-js-php-callback.tar.gz