すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:Java

最終更新日:Feb 29, 2024

このトピックでは、アプリケーションサーバー上のJavaで署名を計算し、アップロードコールバックを設定してから、フォームアップロードを使用してデータをObject Storage Service (OSS) にアップロードする方法について説明します。

前提条件

  • アプリケーションサーバーのドメイン名は、インターネット経由でアクセスできます。

  • アプリケーションサーバには、Java 1.6以降がインストールされています。 Javaバージョンを表示するには、java -versionコマンドを実行します。

  • JavaScriptはコンピュータのブラウザでサポートされています。

手順1: アプリケーションサーバーの設定

  1. アプリケーションサーバーソースコードパッケージをJavaでダウンロードします。

  2. この例では、Ubuntu 16.04が使用されています。 ダウンロードしたパッケージを /home/aliyun/aliyun-oss-appserver-javaディレクトリに展開します。

  3. ディレクトリに移動し、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: クライアントの設定

  1. クライアントソースコードパッケージをダウンロードします。

  2. パッケージをディレクトリに抽出します。 この例では、D:\aliyun\aliyun-oss-appserver-jsディレクトリが使用されています。

  3. ディレクトリに移動し、upload.jsファイルを開き、次のコードを見つけます。

    // serverUrlは、署名やアップロードポリシーなどの情報を返すアプリケーションサーバーのURLを指定します。 serverUrlの値をアプリケーションサーバーの実際のIPアドレスとポート番号に置き換えます。 
    serverUrl = 'http:// 192.0.2.0:8888 ' 
  4. 署名やアップロードポリシーなどの情報をクライアントに返すアプリケーションサーバーのURLにserverUrlを設定します。 この例では、serverUrlはhttps:// 192.168.0.0:8888に設定されています。

ステップ3: CORSの設定

フォームアップロードを使用してクライアントからOSSにデータをアップロードすると、Originヘッダーを含むリクエストがブラウザーからOSSに送信されます。 次に、Originヘッダーを含むリクエストが、バケットに対して設定したクロスオリジンリソース共有 (CORS) ルールと一致するかどうかを確認します。 したがって、ユーザーがPOSTメソッドを使用してバケットにデータをアップロードする前に、バケットのCORSルールを設定する必要があります。

  1. OSSコンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、コンテンツセキュリティ > CORS (クロスオリジンリソース共有) を選択します。

  4. CORSページで、[ルールの作成] をクリックし、次の図に示すように、[ルールの作成] パネルでパラメーターを設定します。

    説明

    データのセキュリティを確保するために、OSSでリクエストを許可するドメイン名を [ソース] フィールドで指定することを推奨します。 パラメーターの設定方法の詳細については、「CORSの設定」をご参照ください。

ステップ4: アップロードコールバック要求を送信する

  1. アプリケーションサーバーを起動します。

    /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パッケージを実行してアプリケーションサーバーを起動します。

  2. クライアントを起動します。

    1. オンプレミスデバイスにインストールされているクライアントで、クライアントソースコードのディレクトリにあるindex.htmlファイルを開きます。

      重要 index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用するときに問題が発生した場合は、デバッグを実行する必要があります。
    2. [ファイルの選択] をクリックし、指定した種類のファイルを選択し、[アップロード] をクリックします。

      ファイルをアップロードすると、アプリケーションサーバーから返されたコンテンツが表示されます。

アプリケーションサーバのソースコードの解析

アプリケーションサーバーのソースコードには、署名ベースのアップロードとアップロードコールバックの完全なサンプルコードが含まれています。

  • 署名ベースのアップロード

    署名ベースのアップロード中、アプリケーションサーバーはクライアントから送信された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操作の詳細については、「コールバック」をご参照ください。