package com.shizhefei.mvc.http.okhttp; import com.shizhefei.mvc.ProgressSender; import com.shizhefei.mvc.data.Data2; import com.shizhefei.mvc.http.MimeUtils; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; public class PostFileMethod extends HttpMethod<PostFileMethod> { public PostFileMethod() { } private Map<String, Data2<String, RequestBody>> httpbodys = new HashMap<String, Data2<String, RequestBody>>(); private CountingRequestBody.Listener listener; public PostFileMethod(String url) { super(url); } public PostFileMethod(OkHttpClient httpClient, String url) { super(httpClient, url); } public PostFileMethod addParam(String key, String fileName, RequestBody requestBody) { httpbodys.put(key, new Data2<String, RequestBody>(fileName, requestBody)); return this; } public PostFileMethod addParam(String key, String fileName, File file) { String mime = MimeUtils.getFileMimeType(file); MediaType mediaType = MediaType.parse(mime); return addParam(key, fileName, RequestBody.create(mediaType, file)); } public PostFileMethod addParam(String key, File file) { return addParam(key, file.getName(), file); } public void setProgressListener(CountingRequestBody.Listener listener) { this.listener = listener; } public void setProgressListener(final ProgressSender progressSender) { this.listener = new CountingRequestBody.Listener() { @Override public void onRequestProgress(long bytesWritten, long contentLength) { progressSender.sendProgress(bytesWritten, contentLength, null); } }; } @Override protected Request.Builder buildRequset(String url, Map<String, Object> params) { MultipartBody.Builder builder = new MultipartBody.Builder(); if (params != null) { for (Entry<String, ?> entry : params.entrySet()) { builder.addFormDataPart(entry.getKey(), String.valueOf(entry.getValue())); } } if (httpbodys != null) { for (Entry<String, Data2<String, RequestBody>> entry : httpbodys.entrySet()) { String key = entry.getKey(); Data2<String, RequestBody> body = entry.getValue(); builder.addFormDataPart(key, body.getValue1(), body.getValue2()); } } RequestBody formBody = builder.build(); if (listener != null) { formBody = new CountingRequestBody(formBody, listener); } return new Request.Builder().url(url).post(formBody); } }