使用OkHttp在多部分上传一个大文件

在Android中使用OKhttp在多部分上传单个大文件(更具体地说是s3)有什么select?

从OkHttp食谱页面 ,这段代码将图像上传到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' 

RequestBodyreplace为:

 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(); } }