十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
简述
成都创新互联凭借在网站建设、网站推广领域领先的技术能力和多年的行业经验,为客户提供超值的营销型网站建设服务,我们始终认为:好的营销型网站就是好的业务员。我们已成功为企业单位、个人等客户提供了成都网站建设、网站建设服务,以良好的商业信誉,完善的服务及深厚的技术力量处于同行领先地位。还是先来说说为啥用OkHttp作为多图片上传的框架,原因有两点:
1、OkHttp可以作为Volley底层传输协议,速度更快
2、使用Xutils和KJFramework上传图片存在一个小问题,首先,可以上传,并且可以上传多张图片,也可以上传其他的参数,那问题在哪里呢?在后台接受参数时很不灵活,Xutlis及KJFramework使用HashMap来上传每个参数,每一张图片也必须有一个唯一的key,上传一张图片就要定义一个参数来接收,上传两张图片就要定义两个参数来接收,当上传的图片数量不确定的时候,如最多9张或者16张,后台接受图片的时候就要定义9个或者16个,这样的方式很不利于扩展,最好是一个参数接收所有所有图片,不会因为这种不确定的问题,就去定义很多的参数,然后一个个判断是否存在。OkHttp底层则不是这样,大概的浏览了下源码,底层接收参数的时候使用的是List,只要使用相同的key就可以添加到同一个list,而后台只需要根据这一个key不断遍历就行,无论多少张图片都无障碍,也没有了后顾之忧。
核心代码实现
//参数类型 private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); //创建OkHttpClient实例 private final OkHttpClient client = new OkHttpClient(); MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM); //遍历map中所有参数到builder for (String key : map.keySet()) { builder.addFormDataPart(key, map.get(key)); } //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key for (String path : paths) { builder.addFormDataPart("upload", null, RequestBody.create(MEDIA_TYPE_PNG, new File(path))); } //构建请求体 RequestBody requestBody = builder.build(); //构建请求 Request request = new Request.Builder() .url(url)//地址 .post(requestBody)//添加请求体 .build(); //发送异步请求,同步会报错,Android4.0以后禁止在主线程中进行耗时操作 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { System.out.println("request = " + request.urlString()); System.out.println("e.getLocalizedMessage() = " + e.getLocalizedMessage()); } @Override public void onResponse(Response response) throws IOException { //看清楚是response.body().string()不是response.body().toString() System.out.println("response = " + response.body().string()); } });