使用OkHttp在multipart中上传大文件

Tom*_*ler 27 upload android file-upload okhttp

使用OKhttp在Android中的multipart中上传单个大文件(更具体地说,到s3)有什么选择?

Jes*_*son 34

OkHttp Recipes页面中,此代码将图像上传到Imgur:

private static final String IMGUR_CLIENT_ID = "...";
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

private final OkHttpClient client = new OkHttpClient();

public void run() throws Exception {
  // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
  RequestBody requestBody = new MultipartBuilder()
      .type(MultipartBuilder.FORM)
      .addPart(
          Headers.of("Content-Disposition", "form-data; name=\"title\""),
          RequestBody.create(null, "Square Logo"))
      .addPart(
          Headers.of("Content-Disposition", "form-data; name=\"image\""),
          RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
      .build();

  Request request = new Request.Builder()
      .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
      .url("https://api.imgur.com/3/image")
      .post(requestBody)
      .build();

  Response response = client.newCall(request).execute();
  if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

  System.out.println(response.body().string());
}
Run Code Online (Sandbox Code Playgroud)

您需要将其调整为S3,但您需要的类应该相同.

  • @TomerWeller你可以创建一个跟踪移动字节的自定义RequestBody.您需要将Sink传递给RequestBody. (6认同)
  • MultiPartBuilder现在称为MultipartBody.Builder,请参阅:http://stackoverflow.com/questions/34676044/multipartbuilder-cant-be-resolved-in-okhttp3-0-0-rc1 (2认同)

Pra*_*ani 32

获取OkHttp 2.1,并使用MultipartBuilder.addFormDataPart()以文件名作为参数.

       /**
         * Upload Image
         *
         * @param memberId
         * @param sourceImageFile
         * @return
         */
        public static JSONObject uploadImage(String memberId, String sourceImageFile) {

            try {
                File sourceFile = new File(sourceImageFile);

                Log.d(TAG, "File...::::" + sourceFile + " : " + sourceFile.exists());

             final MediaType MEDIA_TYPE = sourceImageFile.endsWith("png") ? 
                MediaType.parse("image/png") : MediaType.parse("image/jpeg");


                RequestBody requestBody = new MultipartBuilder()
                        .type(MultipartBuilder.FORM)
                        .addFormDataPart("member_id", memberId)
                        .addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                        .build();

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

                OkHttpClient client = new OkHttpClient();
                Response response = client.newCall(request).execute();
                return new JSONObject(response.body().string());

            } catch (UnknownHostException | UnsupportedEncodingException e) {
                Log.e(TAG, "Error: " + e.getLocalizedMessage());
            } catch (Exception e) {
                Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
            }
            return null;
        }
Run Code Online (Sandbox Code Playgroud)

编辑为okhttp3:

compile 'com.squareup.okhttp3:okhttp:3.4.1'
Run Code Online (Sandbox Code Playgroud)

RequestBody取代:

RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("uploaded_file", filename, RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                    .addFormDataPart("result", "my_image")
                    .build();
Run Code Online (Sandbox Code Playgroud)

GITHUB上载演示:

我添加了多个图像上传的答案:)


Flo*_*ser 5

对于 okhttp 4.* 使用MultipartBody.Builder

fun postMultipart(url: String, text: String, imagePath: String, imageFileName: String): okhttp3.Response? {
    val file = File(imagePath)
    val fileRequestBody = file.asRequestBody("image/jpeg".toMediaType())
    val requestBody = MultipartBody.Builder()
        .addFormDataPart("text", text)
        .addFormDataPart("image", imageFileName, fileRequestBody)
        .build()

    val request = getRequestBuilder(url)
        .post(requestBody)
        .build()

    val client = OkHttpClient()
    client.newCall(request).execute().use { response ->
        return response
    }
}
Run Code Online (Sandbox Code Playgroud)