okhttp を使用してファイルをアップロードする方法は? 質問する

okhttp を使用してファイルをアップロードする方法は? 質問する

私は httpclient として okhttp を使用しています。これは良い API だと思いますが、ドキュメントはあまり詳細ではありません。

ファイルのアップロードを伴う http post リクエストを行うにはどうすればよいですか?

public Multipart createMultiPart(File file){
    Part part = (Part) new Part.Builder().contentType("").body(new File("1.png")).build();
    //how to  set part name?
    Multipart m = new Multipart.Builder().addPart(part).build();
    return m;
}
public String postWithFiles(String url,Multipart m) throws  IOException{
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    m.writeBodyTo(out)
    ;
    Request.Body body =  Request.Body.create(MediaType.parse("application/x-www-form-urlencoded"),
            out.toByteArray());

    Request req = new Request.Builder().url(url).post(body).build();
    return client.newCall(req).execute().body().string();

}

私の質問は次のとおりです:

  1. パーツ名を設定するにはどうすればいいですか? フォームでは、ファイル名は file1 にする必要があります。
  2. フォームに他のフィールドを追加するにはどうすればよいですか?

ベストアンサー1

これは、okhttp を使用してファイルと任意のフィールドをアップロードする基本的な関数です (文字通り、通常の HTML フォームの送信をシミュレートします)。

ファイルに合わせてMIMEタイプを変更するか(ここでは.csvと仮定します)、異なるファイルタイプをアップロードする場合は関数のパラメータにします。

  public static Boolean uploadFile(String serverURL, File file) {
    try {

        RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
                .addFormDataPart("file", file.getName(),
                        RequestBody.create(MediaType.parse("text/csv"), file))
                .addFormDataPart("some-field", "some-value")
                .build();

        Request request = new Request.Builder()
                .url(serverURL)
                .post(requestBody)
                .build();

        client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(final Call call, final IOException e) {
                // Handle the error
            }

            @Override
            public void onResponse(final Call call, final Response response) throws IOException {
                if (!response.isSuccessful()) {
                    // Handle the error
                }
                // Upload successful
            }
        });

        return true;
    } catch (Exception ex) {
        // Handle the error
    }
    return false;
}

注記: 非同期呼び出しなので、ブール値の戻り値はないアップロードが成功したことを示しますが、リクエストが okhttp キューに送信されたことのみを示します。

おすすめ記事