このトピックでは、アプリケーションサーバー上のJavaで署名を計算し、アップロードコールバックを設定してから、フォームアップロードを使用してデータをObject Storage Service (OSS) にアップロードする方法について説明します。
前提条件
アプリケーションサーバーのドメイン名は、インターネット経由でアクセスできます。
アプリケーションサーバには、
Java 1.6
以降がインストールされています。 Javaバージョンを表示するには、java -version
コマンドを実行します。JavaScriptはコンピュータのブラウザでサポートされています。
手順1: アプリケーションサーバーの設定
アプリケーションサーバーソースコードパッケージをJavaでダウンロードします。
この例では、
Ubuntu 16.04
が使用されています。 ダウンロードしたパッケージを /home/aliyun/aliyun-oss-appserver-javaディレクトリに展開します。ディレクトリに移動し、CallbackServer.javaソースコードファイルを開き、ビジネス要件に基づいてソースコードファイルを変更します。 次のサンプルコードは、ソースコードファイルを変更する方法の例を示しています。
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // バケットの名前を指定します。 例: examplebucket. String bucket = "examplebucket"; // ホスト名をhttps:// bucketname.endpoint形式で指定します。 String host = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com"; // アップロードコールバック要求の送信先のアプリケーションサーバーのURLを指定します。 URLはパブリックドメイン名である必要があります。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトをアップロードした後、OSSはURLを使用してアップロード情報をアプリケーションサーバーに送信します。 文字列callbackUrl = "https:// 192.168.0.0:8888"; // アップロードするオブジェクトのプレフィックスを指定します。 このパラメーターは空のままにできます。 このパラメーターを指定しない場合、オブジェクトはバケットのルートディレクトリにアップロードされます。 文字列dir = "exampledir/";
ステップ2: クライアントの設定
クライアントソースコードパッケージをダウンロードします。
パッケージをディレクトリに抽出します。 この例では、
D:\aliyun\aliyun-oss-appserver-js
ディレクトリが使用されています。ディレクトリに移動し、
upload.js
ファイルを開き、次のコードを見つけます。// serverUrlは、署名やアップロードポリシーなどの情報を返すアプリケーションサーバーのURLを指定します。 serverUrlの値をアプリケーションサーバーの実際のIPアドレスとポート番号に置き換えます。 serverUrl = 'http:// 192.0.2.0:8888 '
署名やアップロードポリシーなどの情報をクライアントに返すアプリケーションサーバーのURLに
serverUrl
を設定します。 この例では、serverUrl
はhttps:// 192.168.0.0:8888に設定されています。
ステップ3: CORSの設定
フォームアップロードを使用してクライアントからOSSにデータをアップロードすると、Origin
ヘッダーを含むリクエストがブラウザーからOSSに送信されます。 次に、Origin
ヘッダーを含むリクエストが、バケットに対して設定したクロスオリジンリソース共有 (CORS) ルールと一致するかどうかを確認します。 したがって、ユーザーがPOSTメソッドを使用してバケットにデータをアップロードする前に、バケットのCORSルールを設定する必要があります。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、コンテンツセキュリティ > CORS (クロスオリジンリソース共有) を選択します。
CORSページで、[ルールの作成] をクリックし、次の図に示すように、[ルールの作成] パネルでパラメーターを設定します。
説明データのセキュリティを確保するために、OSSでリクエストを許可するドメイン名を [ソース] フィールドで指定することを推奨します。 パラメーターの設定方法の詳細については、「CORSの設定」をご参照ください。
ステップ4: アップロードコールバック要求を送信する
アプリケーションサーバーを起動します。
/home/aliyun/aliyun-oss-appserver-javaディレクトリで、mvn packageコマンドを実行してコードをコンパイルし、パッケージ化します。 次に、java -jar target/appservermaven-1.0.0.jar 1234コマンドを実行して、アプリケーションサーバーを起動します。
説明IPアドレスとポート番号を、設定したアプリケーションサーバーのIPアドレスとポート番号に置き換えます。
EclipseやIntelliJ IDEAなどの統合開発環境 (IDE) を使用して、JARパッケージをオンプレミスデバイスにエクスポートし、JARパッケージをアプリケーションサーバーにコピーすることもできます。 次に、JARパッケージを実行してアプリケーションサーバーを起動します。
クライアントを起動します。
オンプレミスデバイスにインストールされているクライアントで、クライアントソースコードのディレクトリにあるindex.htmlファイルを開きます。
重要 index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用するときに問題が発生した場合は、デバッグを実行する必要があります。[ファイルの選択] をクリックし、指定した種類のファイルを選択し、[アップロード] をクリックします。
ファイルをアップロードすると、アプリケーションサーバーから返されたコンテンツが表示されます。
アプリケーションサーバのソースコードの解析
アプリケーションサーバーのソースコードには、署名ベースのアップロードとアップロードコールバックの完全なサンプルコードが含まれています。
署名ベースのアップロード
署名ベースのアップロード中、アプリケーションサーバーはクライアントから送信されたGETリクエストに応答します。 サンプルコード:
protected void doGet(HttpServletRequestリクエスト、HttpServletResponseレスポンス) ServletException、IOExceptionをスロー { // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // バケットの名前を指定します。 例: examplebucket. String bucket = "examplebucket"; // ホスト名をhttps:// bucketname.endpoint形式で指定します。 String host = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com"; // アップロードコールバック要求の送信先のアプリケーションサーバーのURLを指定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトをアップロードした後、OSSはURLを使用してアップロード情報をアプリケーションサーバーに送信します。 文字列callbackUrl = "https:// 192.168.0.0:8888"; // アップロードするオブジェクトのプレフィックスを指定します。 このパラメーターは空のままにできます。 このパラメーターを指定しない場合、オブジェクトはバケットのルートディレクトリにアップロードされます。 文字列dir = "exampledir/"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { long expireTime = 30; long expireEndTime = System.currentTimeMillis() + expireTime * 1000; 日付の有効期限=新しい日付 (expireEndTime); // PostObject操作を呼び出すことで、サイズが最大5 GBのオブジェクトをアップロードできます。 サイズが5 GBのオブジェクトをアップロードするには、CONTENT_LENGTH_RANGEを5*1024*1024*1024に設定します。 PolicyConditions policyConds = new PolicyConditions(); policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); String postPolicy = ossClient.generatePostPolicy (有効期限、policyConds); byte[] binaryData = postPolicy.getBytes("utf-8"); String accessId = credentialsProvider.getCredentials().getAccessKeyId(); String encodedPolicy = BinaryUtil.toBase64String(binaryData); String postSignature = ossClient.ca lculatePostSignature(postPolicy); Map<String, String> respMap = new LinkedHashMap<String, String>(); respMap.put("accessid", accessId); respMap.put("policy", encodedPolicy); respMap.put("signature" 、postSignature); respMap.put("dir" 、dir); respMap.put("ホスト" 、ホスト); respMap.put("expire", String.valueOf(expireEndTime / 1000)); // respMap.put("expire", formatISO8601Date (期限切れ)); JSONObject jasonCallback = new JSONObject(); jasonCallback.put("callbackUrl", callbackUrl); jasonCallback.put("callbackBody" 、 "filename =${ object}&size =${ size}&mimeType =${ mimeType}&height =${ imageInfo.height}&width =${ imageInfo.width}"); jasonCallback.put("callbackBodyType" 、"application/x-www-form-urlencoded"); String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes()); respMap.put("callback" 、base64CallbackBody); JSONObject ja1 = JSONObject.fromObject(respMap); // System.out.println(ja1.toString()); response.setHeader("Access-Control-Allow-Origin" 、"*"); response.setHeader("Access-Control-Allow-Methods" 、"GET、POST"); レスポンス (request, response, ja1.toString()); } catch (Exception e) { // Assert.fail(e.getMessage()); System.out.println(e.getMessage()); } 最後に{ ossClient.shutdown(); } }
コールバックのアップロード
protected boolean VerifyOSSCallbackRequest(HttpServletRequest request, String ossCallbackBody) throws NumberFormatException、IOException { ブールret = false; String autorizationInput = new String(request.getHeader("Authorization")); 文字列pubKeyInput = request.getHeader("x-oss-pub-key-url"); byte[] authorization = BinaryUtil.fromBase64String(autorizationInput); byte[] pubKey = BinaryUtil.fromBase64String(pubKeyInput); 文字列pubKeyAddr=新しい文字列 (pubKey); if (!pubKeyAddr.startsWith("https://gosspublic.alicdn.com/") && ! pubKeyAddr.startsWith("https://gosspublic.alicdn.com/")) { System.out.println("pub key addrはoss addrssでなければなりません"); return false; } 文字列retString = executeGet(pubKeyAddr); retString = retString.replace("----- BEGIN PUBLIC KEY -----", "); retString = retString.replace("----- END PUBLIC KEY -----", "); 文字列queryString = request.getQueryString(); String uri = request.getRequestURI(); 文字列decodeUri = java.net.URLDecoder.deコード (uri、"UTF-8"); 文字列authStr = decodeUri; if (queryString != null && !queryString.equals("")) { authStr += "?" + queryString; } authStr += "\n" ossCallbackBody; ret = doCheck(authStr, authorization, retString); return ret; } protected void doPost(HttpServletRequestリクエスト、HttpServletResponseレスポンス) ServletException、IOExceptionをスロー { 文字列ossCallbackBody = GetPostBody(request.getInputStream() 、 Integer.parseInt(request.getHeader("content-length")); boolean ret = VerifyOSSCallbackRequest(request, ossCallbackBody); System.out.println("verify result : " + ret); // System.out.println("OSS Callback Body:" + ossCallbackBody); if (ret) { 応答 (request, response, "{\" Status\":\" OK\"}", HttpServletResponse.SC_OK); } else { 応答 (request, response, "{\" Status\":\" verify not ok\"}", HttpServletResponse.SC_BAD_REQUEST); } }
アップロードコールバックを設定するために呼び出すことができるAPI操作の詳細については、「コールバック」をご参照ください。