私は 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();
}
私の質問は次のとおりです:
- パーツ名を設定するにはどうすればいいですか? フォームでは、ファイル名は file1 にする必要があります。
- フォームに他のフィールドを追加するにはどうすればよいですか?
ベストアンサー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 キューに送信されたことのみを示します。