[Android開発ネタ] Retrofitを使用し、ファイルを送信する

スポンサーリンク

はじめに

multipart/form-dataってものを全然理解していなくてとってもハマったからとりあえず諸々書いておこうと思う。

そもそも今までファイル送信処理を1から作ったことなかった気もする(ぇ

答え

最終形態どうなったか先に書いてしまおう。

MultipartBodyの作成

//
RequestBody fileReqBody = RequestBody.create(MediaType.parse("audio/*"), fileContent);

String boundary = UUID.randomUUID().toString();
MultipartBody body = new MultipartBody.Builder("--" + boundary)
        .setType(MultipartBody.FORM)
        .addFormDataPart("file_content", fileContent.getName(), fileReqBody)
        .build();

Interfaceの作成

//
@Headers({
            "Accept: application/json",
    })
    @POST("postUrl")
    Observable<BaseResponse> postFile(@Body MultipartBody body);

とりあえず、これでファイルの送信はできた。ここまで来るのにかなり時間がかかった、、、。

つまずいたところを書いていく。

FileのContent-Typeをmultipart/form-data にしてもだめって言われる

こうなってた。

Content-Disposition: form-data; name="file_content"
Content-Transfer-Encoding: binary
Content-Type: multipart/form-data
Content-Length: 16428

Partで作成して、Partにmultipart/form-dataを設定するとこうなる。

そもそもファイル名送れてない

Content-Type をaudioにしてみた

Content-Disposition: form-data; name="file_content"; filename="sample.wav"
Content-Type: audio/*
Content-Length: 16428

一応サーバ側でファイルは受信したみたいだけど、その他のパラメータを正確に受け取れていない状態になった。

通信HeaderのContent-Type間違ってた

Accept:application/json
Accept-Encoding:gzip
Connection:Keep-Alive
Content-Length:17993
Content-Type:application/json
Host:13.114.248.91
User-Agent:okhttp/3.8.1

こう書いてた。ただのバカw

//
@Headers({
        "Accept: application/json",
        "Content-Type: application/json",
})

Content-Typeの1行を削除して解決。

通信HeaderのContent-Typeがmultipart/mixedになる

MultipartBodyのsetTypeでMultipartBody.FORMを設定してやると意図したTypeになる。

他にもいろいろハマった(boundaryが付かないとか)けど、大きくハマったのはこれくらい。良い勉強になった。

タイトルとURLをコピーしました