Загрузка большого файла в multipart с использованием OkHttp

Каковы мои возможности для загрузки одного большого файла (точнее, на s3) в multipart на Android с помощью OKhttp?

Solutions Collecting From Web of "Загрузка большого файла в multipart с использованием OkHttp"

На странице 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()); } 

Вам нужно будет адаптировать это значение к S3, но требуемые классы должны быть одинаковыми.

Получите 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; } 

Отредактировано для okhttp3:

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

RequestBody заменяется на:

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

Загружено демо на GITHUB :

Я добавил свой ответ для загрузки нескольких изображений 🙂

Для okhttp 2.6.0 {

  try { File file = new File(Environment.getExternalStorageDirectory().getPath()+"/xxx/share/" + "ic_launcher.png"); String contentType = file.toURL().openConnection().getContentType(); RequestBody fileBody = RequestBody.create(MediaType.parse(contentType), file); RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addFormDataPart("fileUploadType","1") .addFormDataPart("miniType",contentType) .addFormDataPart("ext",file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf("."))) .addFormDataPart("fileTypeName","img") .addFormDataPart("Filedata","ss.png",fileBody) .build(); Request request = new Request.Builder() .url(Contains.MULTIPARTY_POST) .post(requestBody) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { runOnUiThread(new Runnable() { @Override public void run() { tvGetNews.setText("upload fail"); } }); } @Override public void onResponse(Response response) throws IOException { runOnUiThread(new Runnable() { @Override public void run() { tvGetNews.setText("upload success"); } }); } }); } catch (IOException e) { e.printStackTrace(); } }