使用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(); } }
- fileReader.readAsBinaryString来上传文件
- AngularJS:使用$ resource上传文件(解决scheme)
- 如何将file upload到SharePoint文档库?
- 我如何上传整个文件夹,其中包含其他文件夹,在Linux上使用sftp?
- 使用CodeIgniter 2.0多个file upload(数组)
- Html帮助<input type =“file”/>
- move_uploaded_file在所有configuration完成后给出“无法打开stream:权限被拒绝”错误
- 如何testing用户是否select了要上传的文件?
- 如何在JavaScript中实例化一个File对象?