之前在开发当中使用过的网络请求框架Volley、Xutils、async http等,而最近目前最流行的应该是okhttp,网上有很多封装好的工具类,但是发现对图片文件上传的不多,我也是第一次使用okhttp,项目当中有多图片上传的需求,而网上给出的工具类几乎没有对图片文件处理的,最后参考别人的例子才发现媒体文件上传需要重写MultipartBody这个类,其实我发现在之前的项目中使用的volley框架也是如此,对于okhttp上传图片我是这么写的:
Map<String, String> params=new HashMap<>()
//参数
params.put("uid", BaseAppliction.newInstance().getBaseSp().getUid() + "")
params.put("task_id", GetID.taskid + "")
params.put("task_order", GetID.task_order + "")
params.put("utype", BaseAppliction.newInstance().getBaseSp().getUtype() + "")
params.put("remarks", ed_message.getText().toString())
//重写MultipartBody类
MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder()
multipartBodyBuilder.setType(MultipartBody.FORM)
//遍历map中所有参数到builder,为什么会有折磨多的if判断呢,因为后台不支持数组和集合上传所以只能一个个的加判断了,哎都是泪
//参数说明:GetImageFile里面存放的是图片的路径,img1,img2,img3:分别代表第一二三张图片的参数
if (params != null) {
for (String key : params.keySet()) {
multipartBodyBuilder.addFormDataPart(key, params.get(key))
}
if (GetImageFile.list.size() == 1) {//如果上传一张
if (GetImageFile.list.get(0) != null) {
File f = new File(GetImageFile.list.get(0))
multipartBodyBuilder.addFormDataPart("img1", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f))
}
}
if (GetImageFile.list.size() == 2) {//如果上传两张
if (GetImageFile.list.get(0) != null & GetImageFile.list.get(1) != null) {
File f = new File(GetImageFile.list.get(0))
multipartBodyBuilder.addFormDataPart("img1", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f))
File f1 = new File(GetImageFile.list.get(1))
multipartBodyBuilder.addFormDataPart("img2", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f1))
}
}
if (GetImageFile.list.size() == 3) {//如果上传三张
if (GetImageFile.list.get(0) != null & GetImageFile.list.get(1) != null & GetImageFile.list.get(2) != null) {
File f = new File(GetImageFile.list.get(0))
multipartBodyBuilder.addFormDataPart("img1", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f))
File f1 = new File(GetImageFile.list.get(1))
multipartBodyBuilder.addFormDataPart("img2", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f1))
File f2 = new File(GetImageFile.list.get(2))
multipartBodyBuilder.addFormDataPart("img3", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f2))
}
}
}
//构建请求体
RequestBody requestBody = multipartBodyBuilder.build()
Request.Builder RequestBuilder = new Request.Builder()
RequestBuilder.url(url)
RequestBuilder.post(requestBody)
Request request = RequestBuilder.build()
OkHttpClient mOkHttpClient = new OkHttpClient()
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel()
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String str = response.body().string()
System.out.println(str)
call.cancel()
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message()
message.what = tag
handler.sendMessage(message)
}
}).start()
}
})