質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

0回答

1981閲覧

【Android】retrofit2を用いて画像をアップロードしたい

naod

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2018/10/15 02:43

前提・実現したいこと

タイトルの通り、retrofit2を用いて画像をアップロードしたいです。
以下のリクエストパラメータにてリクエストを行っていますが、
サーバー側のログを確認するとuser配下が欠落し({"users"=>"{}"})、
正常にリクエストが出来ておりません。

 user (必須項目)
thumbnail (File)

該当のソースコード

public interface User {
@Multipart
@PATCH({エンドポイント})
Call<JsonObject> uploadImage(
@Header("Authorization") String authToken,
@PartMap Map<String, Map<String, RequestBody>> body
);
}

private User buildClient() {
User result;

Retrofit retrofit = new Retrofit.Builder() .baseUrl(ApiUtils.HOST) .addConverterFactory(GsonConverterFactory.create()) .client(new OkHttpClient.Builder().build()) .build(); result = retrofit.create(UserApi.class); return result;

}

public void uploadImage() {
Map<String, Map<String, RequestBody>> body = new HashMap<>();

Map<String, RequestBody> image = new HashMap<>(); String filePath = "/storage/emulated/0/Download/m_1.jpg"; File file = new File(filePath); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); image.put("image\"; filename=\"m_1.jpg\"", requestFile); body.put("user", image); Call<JsonObject> call = buildClient().uploadImage(mAuthToken, body); call.enqueue(new Callback<JsonObject>() { @Override public void onResponse(Call<JsonObject> call, Response<JsonObject> response) { boolean isSuccessful = response.isSuccessful(); int statusCode = response.code(); if (isSuccessful) { } else { } } @Override public void onFailure(Call<JsonObject> call, Throwable t) { call.cancel(); } });

}

試したこと

上記のように入れ子にしないければ欠落はしませんが、
パラメータが不正のためエラーとなります。
(ステータスコード:400)

public interface User {
@Multipart
@PATCH({エンドポイント})
Call<JsonObject> uploadImage(
@Header("Authorization") String authToken,
@PartMap Map<String, RequestBody> body
);
}

public void uploadImage() {

Map<String, RequestBody> image = new HashMap<>(); String filePath = "/storage/emulated/0/Download/m_1.jpg"; File file = new File(filePath); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); image.put("image\"; filename=\"m_1.jpg\"", requestFile); Call<JsonObject> call = buildClient().uploadImage(mAuthToken, image); call.enqueue(new Callback<JsonObject>() {

~ 以下、省略 ~

補足情報(FW/ツールのバージョンなど)

android studio:3.2
retrofit:2.4.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問