Uploading a large file in multipart using OkHttp Uploading a large file in multipart using OkHttp android android

Uploading a large file in multipart using OkHttp


From the OkHttp Recipes page, this code uploads an image to 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());}

You'll need to adapt this to S3, but the classes you need should be the same.


Get OkHttp 2.1, and use MultipartBuilder.addFormDataPart() which takes the filename as a parameter.

       /**         * 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());             //Determining the media type                     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, 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;        }

#Edited for okhttp3:

compile 'com.squareup.okhttp3:okhttp:3.4.1'

RequestBody replaced by:

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

#Uploaded Demo on GITHUB:##I have added my answer for Multiple Image Upload :)


For okhttp 4.* use the 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    }}