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 }}