このトピックでは、サーバー上のRubyで署名を計算し、アップロードコールバックを設定し、フォームアップロードを使用してデータをOSSにアップロードする方法について説明します。
前提条件
- アプリケーションサーバのドメイン名は、インターネットを介してアクセス可能である。
- アプリケーションサーバーにRuby 2.0以降がインストールされています。 Rubyのバージョンを表示するには、ruby -vコマンドを実行します。
- PCのブラウザはJavaScriptをサポートしています。
手順1: アプリケーションサーバーの設定
- Rubyにあるアプリケーションサーバーのソースコードをダウンロードします。
- Ubuntu 16.04がこの例で使用されています。 ソースコードを /home/aliyun/aliyun-oss-appserver-rubyディレクトリに解凍します。
- ディレクトリに移動します。 ソースコードを含むappserver.rbファイルを開きます。 次のスニペットを変更します。
# AccessKey IDを入力します。 $access_key_id = '<yourAccessKeyId>' # AccessKeyシークレットを入力します。 $access_key_secret = '<yourAccessKeySecret>' # $hostをbucketname.endpointの形式の値に設定します。 $host = 'https:// bucket-name.oss-cn-hangzhou.aliyuncs.com '; # アップロードコールバック要求の送信先のアプリケーションサーバーのURLを指定します。 IPアドレスとポート番号を実際の情報に置き換えます。 $callback_url = "http:// 192.0.2.0:8888"; # アップロードするオブジェクトの名前のプレフィックスを指定します。 $upload_dir = 'user-dir-prefix/'
- $access_key_id: AccessKey IDを入力します。
- $access_key_secret: AccessKeyシークレットを入力します。
- $host: 形式はhttps:// bucketname.endpointです。 例: https://bucket-name.oss-cn-hangzhou.aliyuncs.com。 エンドポイントの詳細については、「Terms」トピックの「エンドポイント」セクションを参照してください。
- $callback_url: アップロードコールバック要求の送信先のアプリケーションサーバーのURLを指定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトをアップロードした後、OSSはURLを使用してオブジェクトアップロードに関する情報をアプリケーションサーバーに送信します。 この例では、
$callback_url="http:// 192.0.2.0:1234";
を指定します。 - $upload_dir: オブジェクトの名前のプレフィックスを指定します。 このパラメーターを指定しないままにすることもできます。
ステップ2: クライアントの設定
- クライアントソースコードパッケージをダウンロードします。
- パッケージをディレクトリに解凍します。 この例では、D:\aliyun\aliyun-oss-appserver-jsディレクトリが使用されています。
- ディレクトリに移動し、upload.jsファイルを開き、次のコードを見つけます。
// serverUrlは、署名情報とアップロードポリシーを返すアプリケーションサーバーのURLを指定します。 ビジネスシナリオでは、サンプルのIPアドレスとポート番号を実際の値に置き換えます。 serverUrl = 'http:// 192.0.2.0:8888 '
- 署名やアップロードポリシーなどの情報をクライアントに返すアプリケーションサーバーのURLに
severUrl
を設定します。 この例では、serverUrl = 'http:// 192.0.2.0:1234 '
を指定します。
ステップ3: CORS設定の変更
フォームアップロードを使用してクライアントからOSSにデータをアップロードする場合、クライアントはリクエストにOrigin
ヘッダーを含め、ブラウザーを使用してリクエストをOSSに送信します。 OSSは、クロスオリジンリソース共有 (CORS) 検証用のOrigin
ヘッダーを含むリクエストメッセージを検証します。 POSTメソッドを使用するには、バケットのCORSルールを設定します。
ステップ4: アップロードコールバック要求を送信する
- アプリケーションサーバーを起動します。 /home/aliyun/aliyun-oss-appserver-rubyディレクトリで、ruby appserver.rb 192.0.2.0 1234コマンドを実行して、アプリケーションサーバーを起動します。説明 IPアドレスとポート番号を、設定したアプリケーションサーバーのIPアドレスとポート番号に置き換えます。
- クライアントを起動します。PCで、クライアントソースコードを含むディレクトリにあるindex.htmlファイルを開きます。重要 index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用するときに問題が発生した場合は、デバッグを実行する必要があります。
- オブジェクトをアップロードします。[ファイルの選択] をクリックします。 指定したタイプのファイルを選択します。 [アップロード] をクリックします。 オブジェクトがアップロードされると、コールバックサーバーによって返されたコンテンツが表示されます。
アプリケーションサーバのコアコード解析
アプリケーションサーバーのソースコードは、署名ベースのアップロードとアップロードコールバックを実装するために使用されます。
- 署名ベースのアップロード
署名ベースのアップロード中、アプリケーションサーバーはクライアントから送信されたGETメッセージに応答します。 スニペットの例:
def get_token() expire_syncpoint = Time.now.to_i + $expire_time expire = Time.at(expire_syncpoint).utc.iso8601() response.headers['expire'] = expire policy_dict = {} condition_arrary = Array.new array_item = Array.new array_item.push('starts-with') array_item.push('$key') array_item.push($upload_dir) condition_arrary.push(array_item) policy_dict["conditions"] = condition_arrary policy_dict["expiration"] = expire policy = hash_to_jason(policy_dict) policy_encode = Base64.strict_encode64 (ポリシー).chomp; h = OpenSSL::HMAC.digest('sha1', $access_key_secret, policy_encode) hs=ダイジェスト::MD5.hexdigest(h) sign_result = Base64.strict_encode64(h).strip() callback_dict = {} callback_dict['callbackBodyType'] = 'application/x-www-form-urlencod'; callback_dict['callbackBody'] = 'filename =${ object}&size =${ size}&mimeType =${ mimeType}&height =${ imageInfo.height}&width =${ imageInfo.width}'; callback_dict['callbackUrl'] = $callback_url; callback_param = hash_to_jason(callback_dict) base64_callback_body = Base64.strict_encode64(callback_param); token_dict = {} token_dict['accessid'] = $access_key_id token_dict['host'] = $host token_dict['policy'] = policy_encode token_dict['signature'] = sign_result token_dict['expire'] = expire_syncpoint token_dict['dir'] = $upload_dir token_dict['callback'] = base64_callback_body response.headers["アクセス制御-許可-メソッド"] = "POST" response.headers["Access-Control-Allow-Origin"] = "*" result = hash_to_jason(token_dict) 結果 終了 '/*' を取得する 「 ********************* GET」を置く get_token() 終了
- アップロードコールバック
アップロードコールバック中に、アプリケーションサーバーはOSSから送信されたPOSTメッセージに応答します。 スニペットの例:
post '/*' do 「 ********************* POST」を置く pub_key_url = Base64.decode64(get_header('x-oss-pub-key-url')) pub_key = get_public_key(pub_key_url) rsa = OpenSSL::PKey::RSA.new(pub_key) authorization = Base64.decode64(get_header('authorization')) req_body = request.body.read if request.query_string.empty? then auth_str = CGI.unescape(request.path) + "\n" + req_body else auth_str = CGI.unescape(request.path) + '?' + request.query_string + "\n" + req_body end valid = rsa.public_key.verify () OpenSSL:: ダイジェスト::MD5.new, authorization, auth_str) 有効な場合 # body({'Status' => 'OK'}.to_json) body(hash_to_jason({'Status' => 'OK'})) else 停止400、「許可に失敗しました! 」 終了 終了
詳細については、「コールバック」トピックの「 (オプション) 手順4: コールバック要求に署名する」セクションを参照してください。