之前上传图片都是直接将图片转化为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));导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# okhttp上传图片带参数
# okhttp上传文件带参数
# okhttp上传图片和参数
# Android使用 Retrofit 2.X 上传多文件和多表单示例
# 基于标准http实现Android多文件上传
# Android Retrofit实现多图片/文件、图文上传功能
# Android 使用 okhttp3和retrofit2 进行单文件和
# 上传图片
# 多张
# 遍历
# 都是
# 上传
# 也有
# 也能
# 有一次
# 找了
# 发展到
# 换个
# 转化为
# 需要注意
# 大家多多
# 键值
# 过程中
# 新到
# 写成了
# 在网上
# 我对该
相关文章:
C#如何使用XPathNavigator高效查询XML
C++中引用和指针有什么区别?(代码说明)
定制建站流程步骤详解:一站式方案设计与开发指南
如何在IIS7上新建站点并设置安全权限?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
,柠檬视频怎样兑换vip?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
建站之星微信建站一键生成小程序+多端营销系统
如何在Windows 2008云服务器安全搭建网站?
家庭建站与云服务器建站,如何选择更优?
如何通过宝塔面板实现本地网站访问?
如何选择香港主机高效搭建外贸独立站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
建站之星如何助力企业快速打造五合一网站?
广德云建站网站建设方案与建站流程优化指南
免费网站制作appp,免费制作app哪个平台好?
seo网站制作优化,网站SEO优化步骤有哪些?
高防服务器租用指南:配置选择与快速部署攻略
网站制作需要会哪些技术,建立一个网站要花费多少?
北京制作网站的公司,北京铁路集团官方网站?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
制作企业网站建设方案,怎样建设一个公司网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
网站制作费用多少钱,一个网站的运营,需要哪些费用?
如何设置并定期更换建站之星安全管理员密码?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星CMS五站合一模板配置与SEO优化指南
独立制作一个网站多少钱,建立网站需要花多少钱?
如何访问已购建站主机并解决登录问题?
网站制作公司,橙子建站是合法的吗?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
建站VPS推荐:2025年高性能服务器配置指南
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Swift中switch语句区间和元组模式匹配
代购小票制作网站有哪些,购物小票的简要说明?
如何在云主机上快速搭建网站?
公司门户网站制作流程,华为官网怎么做?
如何选择高效稳定的ISP建站解决方案?
实现虚拟支付需哪些建站技术支撑?
制作网站的公司有哪些,做一个公司网站要多少钱?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何配置FTP站点权限与安全设置?
香港服务器部署网站为何提示未备案?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
开心动漫网站制作软件下载,十分开心动画为何停播?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
如何用腾讯建站主机快速创建免费网站?
如何在搬瓦工VPS快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。