Android okhttp上传图片文件

之前在开发当中使用过的网络请求框架Volley、Xutils、async http等,而最近目前最流行的应该是okhttp,网上有很多封装好的工具类,但是发现对图片文件上传的不多,我也是第一次使用okhttp,项目当中有多图片上传的需求,而网上给出的工具类几乎没有对图片文件处理的,最后参考别人的例子才发现媒体文件上传需要重写MultipartBody这个类,其实我发现在之前的项目中使用的volley框架也是如此,对于okhttp上传图片我是这么写的:
 Map 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();
                    }
                });

你可能感兴趣的:(移动开发)