在Marshmallow上传Android Multipart Form File

时间:2016-06-16 17:39:10

标签: android file-upload okhttp okhttp3

我正在尝试使用multipart表单将文件上传到服务器。 由于API 23 Android已弃用Apache HTTP库。

我转而使用OkHttp进行文件上传,如下所示:

        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart(name, fileName, requestBodyPart)
                .build();

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

requestBodyPart是:

        requestBodyPart = new RequestBody() {
            @Override
            public MediaType contentType() {
                return MediaType.parse(contentType);
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                try {
                    if (sink.writeAll(Okio.source(inputStream)) == 0) {
                        throw new IOException("Empty File!");
                    }
                } finally {
                    MiscUtils.closeCloseable(inputStream);
                }
            }
        };

然而,就文件上传而言,OkHttp似乎并不那么出色。很多超时并且似乎创建了几层抽象(源和接收器)并且在文件数据仍然通过套接字写入时触发了此AsyncTimeout。

是否有任何关于从Android开始使用API​​ 23的多部分文件上传的建议。我知道我可以包含HTTP遗留库,但由于它已被删除,我宁愿不这样做。或者有没有办法可以提高OkHttp的性能?

1 个答案:

答案 0 :(得分:0)

这应该有效

String name = ...
File file = ...
MediaType mediaType = MediaType.parse(...)
OkHttpClient httpClient = ...
Request request = new Request.Builder()
        .url(url)
        .post(new MultipartBuilder().type(MultipartBuilder.FORM)
                                    .addFormDataPart(name,
                                                     file.getName(),
                                                     RequestBody.create(mediaType, file))
                                    .build())
        .build();
try {
    Response response = httpClient.newCall(request).execute();
} catch (IOException e) {
    // handle error
}
相关问题