Retrofit2を使用してAWSS3の事前署名されたURLにファイルをアップロードします

Gary99

事前に署名されたURLを使用してAmazonのS3にファイルをアップロードしようとしています。URLを生成するサーバーからURLを取得し、JSONオブジェクトの一部として送信します。URLを文字列として取得します。次のようになります。

https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/ImageName?X-Amz-Security-Token=xxfooxx%2F%2F%2F%2F%2F%2F%2F% 2F%2F%2Fxxbarxx%3D&X-Amz-Algorithm = xxAlgoxx&X-Amz-Date = 20170831T090152Z&X-Amz-SignedHeaders = host&X-Amz-Expires = 3600&X-Amz-Credential = xxcredxx&X-Amz-Signature = xx

残念ながら、これをRetrofit2に渡すと、文字列が変更されてURLになります。私はencoding=true問題の大部分を処理したが完全ではないものを設定しました。Stringがそのまま機能することはわかっています。私はPostmanでそれを試し、成功した応答を得ました。

最初に、文字列(baseUrlとして切り取ったものを除く)全体をパスに入れてみました

public interface UpdateImageInterface {
    @PUT("{url}")
    Call<Void> updateImage(@Path(value="url", encoded=true) String url, Body RequestBody image);
}

呼び出しコード:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/")
            .build();

    UpdateImageInterface imageInterface = retrofit.create(UpdateImageInterface.class);
    // imageUrl is "ImageName..."
    Call<Void> call = imageInterface.updateImage(imageUrl, requestFile);

これは主に「?」を除いて機能します (「ImageName」の後)「%3F」に変換されます。これにより、不正な要求/ 400が発生します。

次の試みは、Retrofit2を使用してクエリを作成しましたが、文字列全体(複数のクエリを含む)をクエリにダンプしました。

public interface UpdateImageInterface {
    @PUT("ImageName")
    Call<Void> updateProfilePhoto(@Query(value="X-Amz-Security-Token", encoded = true) String token, @Body RequestBody image);
}

呼び出しコード:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/")
            .build();

    UpdateImageInterface imageInterface = retrofit.create(UpdateImageInterface.class);
    // imageUrl is "xxfooxx..."
    Call<Void> call = imageInterface.updateImage(imageUrl, requestFile);

これは「?」を取得します 正しくレンダリングされますが、すべての「&」が「%26」に変更されます

最後に、文字列全体を渡そうとしましたが、最後にbaseUrl()「/」がないためにIllegalArgumentExceptionが発生します。

事前に署名されたURLを解析して複数のクエリを作成し、クエリを実行する必要があるため、Retrofit2でそれらをアセンブルできることは知っていますが、その処理は避けたいと思います。

質問を言い換えると:

Retrofit2を使用して、事前に署名されたURLを使用してファイルをS3に簡単に(重い文字列解析なしで)アップロードする方法はありますか?

Gary99

同僚の助けを借りて、これが解決策です。

public interface UpdateImageInterface {
    @PUT
    Call<Void> updateImage(@Url String url, @Body RequestBody image);
}

発信コード:

    String CONTENT_IMAGE = "image/jpeg";

    File file = new File(localPhotoPath);    // create new file on device
    RequestBody requestFile = RequestBody.create(MediaType.parse(CONTENT_IMAGE), file);

    /* since the pre-signed URL from S3 contains a host, this dummy URL will
     * be replaced completely by the pre-signed URL.  (I'm using baseURl(String) here
     * but see baseUrl(okhttp3.HttpUrl) in Javadoc for how base URLs are handled
     */
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.dummy.com/")
        .build();

    UpdateImageInterface imageInterface = retrofit.create(UpdateImageInterface.class);
    // imageUrl is the String as received from AWS S3
    Call<Void> call = imageInterface.updateImage(imageUrl, requestFile);

@Url(クラスUrl)およびbaseUrl()(クラスRetrofit.Builder)に関する情報のJavadoc

MediaTypeは、Retrofit(両方ともSquareから)でよく使用されるOkHttpライブラリのクラスです。parseメソッドに渡される定数に関する情報は、Javadocにあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

AWSS3の事前署名されたURLRetrofit2AndroidにアップロードファイルをPUT

分類Dev

事前に署名されたURLを使用してAWSs3からファイルの内容を読み取ります

分類Dev

Ionic android-事前に署名されたURLを使用してファイルをS3にアップロードします(エラーコード:3)

分類Dev

NodeJSを使用してffmpegファイルの出力をAWSs3にアップロードします

分類Dev

Rubyで事前に署名されたPOSTファイルをAWSS3にアップロードするにはどうすればよいですか?

分類Dev

Pythonを使用してファイルをGoogleストレージにアップロードするための事前署名されたURLを生成します

分類Dev

角度またはJavaScriptで事前に署名されたURLを使用してS3バケットにファイルをアップロードする方法

分類Dev

Rails 3.1:PaperClip / Mongoid / SimpleForm <-ネストされたフォームを使用してAWSS3にファイルをアップロードする

分類Dev

NodeJSを使用してAWSS3に複数のファイルをアップロードする

分類Dev

何をしても、事前に署名されたURLを使用してファイルをS3にアップロードできません。AWSコマンドラインは機能します。CURLおよびその他= 403

分類Dev

演奏する!ファイルをアップロードしてAWSS3に保存します

分類Dev

AWSAppSyncを使用してAWSS3にファイルをアップロードする方法

分類Dev

AWSAppSyncを使用してAWSS3にファイルをアップロードする方法

分類Dev

アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要がありますAWSS3へのファイルのアップロード

分類Dev

アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要がありますAWSS3へのファイルのアップロード

分類Dev

一度に多数のファイルをAWSS3にアップロードします

分類Dev

rubyを使用して、awss3の同じディレクトリに複数のファイルをアップロードします

分類Dev

Retrofit2を使用してファイルをSlackにアップロードします

分類Dev

std :: fstreamでgz圧縮されたファイルの事前署名されたURLを使用して、AWS S3 HTTPアップロードのコンテンツの長さを設定するにはどうすればよいですか?

分類Dev

iOSSDKを使用してAWSS3にファイルをアップロードするときに空白のカスタムメタデータ

分類Dev

AWSS3バケットにアップロードされた複数のファイルのデフォルトのコンテンツタイプを変更します

分類Dev

retrofit2を使用してアップロードした後、「ディスク上に0バイト」のファイルを取得する

分類Dev

ChaliceAPI呼び出しを介したAWSS3へのファイルのアップロード

分類Dev

pythonbotoを使用してAWSS3ファイルをダウンロードすると、ファイルが存在していても404が返されます

分類Dev

salesforce apexを使用して大きなファイル(12 MBを超える)をawss3バケットにアップロードする方法

分類Dev

Laravel5.1経由でAWSS3に画像/ファイルをアップロードします。残念ながら画像は破損しています

分類Dev

Laravel5.1経由でAWSS3に画像/ファイルをアップロードします。残念ながら画像は破損しています。

分類Dev

バケットリージョンをフェッチしてクライアントに渡す方法o事前に署名されたURLを生成するawss3

分類Dev

Laravelにアップロードした後、awss3ファイルのパーミッションをパブリックに設定する

Related 関連記事

  1. 1

    AWSS3の事前署名されたURLRetrofit2AndroidにアップロードファイルをPUT

  2. 2

    事前に署名されたURLを使用してAWSs3からファイルの内容を読み取ります

  3. 3

    Ionic android-事前に署名されたURLを使用してファイルをS3にアップロードします(エラーコード:3)

  4. 4

    NodeJSを使用してffmpegファイルの出力をAWSs3にアップロードします

  5. 5

    Rubyで事前に署名されたPOSTファイルをAWSS3にアップロードするにはどうすればよいですか?

  6. 6

    Pythonを使用してファイルをGoogleストレージにアップロードするための事前署名されたURLを生成します

  7. 7

    角度またはJavaScriptで事前に署名されたURLを使用してS3バケットにファイルをアップロードする方法

  8. 8

    Rails 3.1:PaperClip / Mongoid / SimpleForm <-ネストされたフォームを使用してAWSS3にファイルをアップロードする

  9. 9

    NodeJSを使用してAWSS3に複数のファイルをアップロードする

  10. 10

    何をしても、事前に署名されたURLを使用してファイルをS3にアップロードできません。AWSコマンドラインは機能します。CURLおよびその他= 403

  11. 11

    演奏する!ファイルをアップロードしてAWSS3に保存します

  12. 12

    AWSAppSyncを使用してAWSS3にファイルをアップロードする方法

  13. 13

    AWSAppSyncを使用してAWSS3にファイルをアップロードする方法

  14. 14

    アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要がありますAWSS3へのファイルのアップロード

  15. 15

    アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要がありますAWSS3へのファイルのアップロード

  16. 16

    一度に多数のファイルをAWSS3にアップロードします

  17. 17

    rubyを使用して、awss3の同じディレクトリに複数のファイルをアップロードします

  18. 18

    Retrofit2を使用してファイルをSlackにアップロードします

  19. 19

    std :: fstreamでgz圧縮されたファイルの事前署名されたURLを使用して、AWS S3 HTTPアップロードのコンテンツの長さを設定するにはどうすればよいですか?

  20. 20

    iOSSDKを使用してAWSS3にファイルをアップロードするときに空白のカスタムメタデータ

  21. 21

    AWSS3バケットにアップロードされた複数のファイルのデフォルトのコンテンツタイプを変更します

  22. 22

    retrofit2を使用してアップロードした後、「ディスク上に0バイト」のファイルを取得する

  23. 23

    ChaliceAPI呼び出しを介したAWSS3へのファイルのアップロード

  24. 24

    pythonbotoを使用してAWSS3ファイルをダウンロードすると、ファイルが存在していても404が返されます

  25. 25

    salesforce apexを使用して大きなファイル(12 MBを超える)をawss3バケットにアップロードする方法

  26. 26

    Laravel5.1経由でAWSS3に画像/ファイルをアップロードします。残念ながら画像は破損しています

  27. 27

    Laravel5.1経由でAWSS3に画像/ファイルをアップロードします。残念ながら画像は破損しています。

  28. 28

    バケットリージョンをフェッチしてクライアントに渡す方法o事前に署名されたURLを生成するawss3

  29. 29

    Laravelにアップロードした後、awss3ファイルのパーミッションをパブリックに設定する

ホットタグ

アーカイブ