Android okhttp上传图片文件

来源:互联网 发布:viso 网络拓扑图图标 编辑:程序博客网 时间:2024/05/22 03:18
之前在开发当中使用过的网络请求框架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);// 添加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();                        /**注意为什么会有一个Thread:这可是一个同步操作,不是异步的啊,假如你想在数据请求成功后,也就是表单提交成功后                       * 你想 Toast.makeText(this,"上传成功",Toast.LENGTH_SHORT).show();  会直接抛出异常,所以创建一个线程外边接受handler                       * toast就行了                       */                        new Thread(new Runnable() {                            @Override                            public void run() {                                Message message = new Message();                                message.what = tag;                                handler.sendMessage(message);                            }                        }).start();                    }                });
原创粉丝点击