このトピックでは、サーバー側で署名を実装し、アップロードコールバックを設定し、Go言語を使用してHTMLフォームからObject Storage Service (OSS) への直接アップロードを有効にする方法について説明します。
前提条件
アプリケーションサーバーのドメイン名は、インターネット経由でアクセスできます。
アプリケーションサーバーにGo 1.6以降がインストールされています。 Goバージョンを確認するには、
go version
コマンドを実行します。PCのブラウザはJavaScriptをサポートしています。
手順1: アプリケーションサーバーの設定
ソースコードを目的のディレクトリに配置します。 この例では、ソースコードはUbuntu 16.04の
/home/aliyun/aliyun-oss-appserver-go
ディレクトリに配置されます。ディレクトリに移動します。
appserver.go
ファイルを開きます。 次のスニペットを変更します。// Enter your AccessKey ID. var accessKeyId string = "<yourAccessKeyId>" // Enter your AccessKey secret. var accessKeySecret string = "<yourAccessKeySecret>" // Set host to a value that is in the format of bucketname.endpoint. var host string = "https://bucket-name.oss-cn-hangzhou.aliyuncs.com'" // Specify the URL of the application server to which an upload callback request is sent. Replace the IP address and port number with your actual information. var callbackUrl string = "http://192.0.2.0:8888"; // Specify the prefix for the name of the object you want to upload. var upload_dir string = "user-dir-prefix/" // Specify the validity period in seconds for the upload policy. var expire_time int64 = 30
accessKeyId: AccessKey IDを入力します。
accessKeySecret: AccessKeyシークレットを入力します。
host: 形式は
https:// bucketname.endpoint
です。 例:https://bucket-name.oss-cn-hangzhou.aliyuncs.com
。 エンドポイントの詳細については、「エンドポイント」をご参照ください。callbackUrl: アップロードコールバック要求の送信先であるアプリケーションサーバーのコールバックURLを指定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトをアップロードした後、OSSはURLを使用してアップロード情報をアプリケーションサーバーに送信します。 この例では、
"http:// 192.0.2.0:1234"
がコールバックURLです。dir: オブジェクトの名前のプレフィックスを指定します。 このパラメータは空のままにすることもできます。
ステップ2: クライアントの設定
クライアントソースコードをPCのローカルディレクトリにダウンロードします。
パッケージを解凍します。 upload.jsファイルを開きます。 ファイルから次の行を検索します。
// 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://192.0.2.0:8888'
serverUrlをアプリケーションサーバーのURLに設定します。 この例では、serverUrlは
'http:// 192.0.2.0:1234 '
に設定されています。
ステップ3: CORS設定の変更
フォームアップロードを使用してクライアントからOSSにデータをアップロードすると、Origin
ヘッダーを含むリクエストがブラウザーからOSSに送信されます。 OSSは、Origin
ヘッダーを含むリクエストがバケットのクロスオリジンリソース共有 (CORS) ルールと一致するかどうかをチェックします。 異なるオリジンからバケットへのPOSTベースのアップロードを許可するには、適切なCORSルールを設定する必要があります。
ステップ4: ファイルをアップロードする
アプリケーションサーバを起動します。
/home/aliyun/aliyun-oss-appserver-go
ディレクトリで、go run appserver.go 192.0.2.0 1234コマンドを実行して、アプリケーションサーバーを起動します。説明IPアドレスとポート番号を、アプリケーションサーバーのIPアドレスとポート番号に置き換えます。
クライアントを起動します。
クライアントソースコードが保存されているローカルディレクトリに移動し、index.htmlブラウザのファイル
重要index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用しているときに問題が発生した場合は、デバッグを実行します。
[ファイルの選択] をクリックし、サポートされているタイプのファイルを選択します。 [アップロード] をクリックします。 オブジェクトをアップロードすると、アプリケーションサーバーから返されたコンテンツが表示されます。
アプリケーションサーバのコアコード
アプリケーションサーバーのソースコードは、署名ベースの直接アップロードおよびアップロードコールバックを実装します。
署名ベースの直接アップロード
アプリケーションサーバは、クライアントから送信されたGET要求に応答する。 サンプルコード:
func handlerRequest(w http.ResponseWriter, r *http.Request) { if (r.Method == "GET") { response := get_policy_token() w.Header().Set("Access-Control-Allow-Methods", "POST") w.Header().Set("Access-Control-Allow-Origin", "*") io.WriteString(w, response) }
コールバックのアップロード
アプリケーションサーバーは、OSSから送信されたPOSTメッセージに応答します。 サンプルコード
if (r.Method == "POST") { fmt.Println("\nHandle Post Request ... ") // Get PublicKey bytes bytePublicKey, err := getPublicKey(r) if (err != nil) { responseFailed(w) return } // Get Authorization bytes : decode from Base64String byteAuthorization, err := getAuthorization(r) if (err != nil) { responseFailed(w) return } // Get MD5 bytes from Newly Constructed Authorization String. byteMD5, err := getMD5FromNewAuthString(r) if (err != nil) { responseFailed(w) return } // verifySignature and response to client if (verifySignature(bytePublicKey, byteMD5, byteAuthorization)) { // do something you want according to callback_body ... responseSuccess(w) // response OK : 200 } else { responseFailed(w) // response FAILED : 400 } }
詳細については、「コールバック」をご参照ください。