Okhttp3上传多张图片同时传递参数

之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。

最近做项目,打算换个方法上传图片。

Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片。

Okhttp目前已经更新到Okhttp3版本了,用法跟之前相比,也有一些差别。在网上找了很多资料,

并和java后台同事反复调试,终于成功上传多张图片,同时传递一些键值对参数。

以下是我对该过程的封装:

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

/**
     * 上传多张图片及参数
     * @param reqUrl URL地址
     * @param params 参数
     * @param pic_key 上传图片的关键字
     * @param paths  图片路径
     */
    public Observable<String> sendMultipart(String reqUrl,Map<String, String> params,String pic_key, List<File> files){
        return Observable.create(new Observable.OnSubscribe<String>(){

            @Override
            public void call(Subscriber<? super String> subscriber) {
                MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
                multipartBodyBuilder.setType(MultipartBody.FORM);
                //遍历map中所有参数到builder
                if (params != null){
                    for (String key : params.keySet()) {
                        multipartBodyBuilder.addFormDataPart(key, params.get(key));
                    }
                }
                //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
                if (files != null){
                    for (File file : files) {
                        multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
                    }
                }
                //构建请求体
                RequestBody requestBody = multipartBodyBuilder.build();

                Request.Builder RequestBuilder = new Request.Builder();
                RequestBuilder.url(reqUrl);// 添加URL地址
                RequestBuilder.post(requestBody);
                Request request = RequestBuilder.build();
                mOkHttpClient.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        subscriber.onError(e);
                        subscriber.onCompleted();
                        call.cancel();
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String str = response.body().string();
                        subscriber.onNext(str);
                        subscriber.onCompleted();
                        call.cancel();
                    }
                });
            }
        });
    }

在UI界面的调用:

OkHttp3Utils.getInstance().sendMultipart(Constants.URL.URL_ADD_NOTICE, mMap, "appendix", mImageList)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable throwable) {
                        LogUtil.i(TAG, "throwable:" + throwable.toString());
                    }

                    @Override
                    public void onNext(String s) {

                        LogUtil.i(TAG, "s:" + s);
                    }
                });

调试过程中,有一次将

multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));写成了
multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。

最后:非常感谢同事的帮助!赠人玫瑰,手有余香~
时间: 2024-10-12 12:24:27

Okhttp3上传多张图片同时传递参数的相关文章

微信js sdk上传多张图片

微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="11111111111111111111"; $secret="11111111111111111111"; $token = S('access_token'); if (!$token) { $res = file_get_contents("https://api.weixin.qq.c

[原创]使用ajaxFileUpload.js上传文件时附带额外参数。

最近公司的一个项目涉及到导入Excel的功能,于是就想到用ajaxFileUpload来实现上传文件,因为用过很多次了,网上也有很多文章介绍.使用方法不表.但是在附带参数这个环节卡住了:文件可以上传到后台,但是附带的json参数怎么都传不到后台. 通过网上的文章和查看ajaxFileUpload.js源码发现:ajaxFileUpload.js本身根本就不支持附带参数. function ajaxFileUpload(DOMId,row){ var param={"exam.class_id&q

Alamofire +ObjectMapper模型: 上传单张图片,上传多张图片。

import Foundation import Alamofire //上传图片 ,multipartFormData 上传.key = attach extension HttpManager { /** 上传单张图片 - parameter image:   UIImage - parameter success: 成功回调图片 model - parameter failure: 失败 */ class func uploadSingleImage( _ image:UIImage, s

ASP.NET(C#)实现一次性动态上传多张图片的代码(多个文件)

在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求.通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定.因此我们就要让这些文件上传框动态添加,下面我以我做的一个图库管理中的上传图片的功能为例 默认是上传一个图片,但当我们点“增加图片”按钮时可以实现选择多个图片及其描述同时上传,本功能限制一次最多只能上传8张,且每张图片大小不超过1M,这个大家可根据实际情况更改! 第一步,使用javascript代码实现动态添加文

微信JSSDK上传多张图片

之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid-2069.asp 做过微信开发的都知道,在部分android机型里微信不支持网页上传图片的,这是由于这些机型的文件上传存在内存泄漏,会导致微信闪退,所以微信内置浏览器将文件上传屏蔽.这就导致这些机型的用户在使用微信浏览器访问某些需要上传图片的网页时功能不正常. 前不久微信公开了一些接口,其中有一个

关于最新版AFNetworking(3.0)上传多张图片的问题

最新版的AF已经废弃了很多以前的类,所以很多以前的方法都不能用了,当然最主要还是为了适应ipV6所做的更改.楼主最近正在写多张图片上传,碰到了一些问题,解决之后直接封装了一个方法,废话有点多了,上代码: //上传多张图片 + (void)requestWithUrl:(NSString *)url withPostedImages:(NSArray *)imagesArray WithSuccessBlock:(void (^)(NSArray * resultArray))successBlo

上传多张图片时 ,对 $_FILES 的处理. upload

上传多张图片, 要对 $_FILES进行 重新处理. 1 //添加 2 public function addCourseAlbumAction() 3 { 4 $CourseAlbumModel = new CourseAlbumModel(); 5 $CourseAlbumModel->title = $_REQUEST["title"]; 6 $CourseAlbumModel->courseId = $_REQUEST["courseId"];

上传数据+上传一张图片

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ajax上传数据(1.解决传送数据乱码问题2.苹果手机上传图片翻转问题)</title> <meta name="viewport" content="width=device-width,initial-scale=1,

【JS】【33】解决 重复上传同一张图片,第二次无反应 的问题

正文: <input style="display:none" type="file" id="img" οnchange="uploadImage(event)" accept="image/jpg, image/jpeg, image/gif, image/png"> 问题:用户上传图片A,然后点击删除,然后又再次上传图片A,程序没有反应 原因:第二次上传还是上一张图片的时候,onchang