前言:现在大多数的项目中都涉及图片+文字上传了,下面请详见实现原理:

开发环境:AndroidStudio
1.引入依赖:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
2.网络权限:
<uses-permission android:name="android.permission.INTERNET" />
3.创建上传对象OkHttpClient :
private static final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain
.request()
.newBuilder()
.build();
return chain.proceed(request);
}
})
.readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(10, TimeUnit.SECONDS)//设置写的超时时间
.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
.build();
4.上传图片的公有方法:
private synchronized final static void uploadImgAndParameter(Map<String, Object> map, String url,
final UIDataListener listener) {
// mImgUrls为存放图片的url集合
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
if (null != map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() != null) {
if (entry.getValue() instanceof File) {
File f = (File) entry.getValue();
builder.addFormDataPart(entry.getKey(), f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
} else {
builder.addFormDataPart(entry.getKey(), entry.getValue().toString());
}
}
}
}
//创建RequestBody
RequestBody body = builder.build();
// MultipartBody requestBody = builder.build();
//构建Request请求
final Request request = new Request.Builder()
.url(url)//地址
.post(body)//添加请求体
// .post(requestBody)//添加请求体
.build();
client.newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {//判断是否成功
final String data = response.body().string();//string()仅可调用一次。否则报IllegalStateException: closed异常
Log.i("file1", "上传照片成功-->" + data);
onSuccess(listener, data);
call.cancel();//上传成功取消请求释放内存
}
}
@Override
public void onFailure(Call call, final IOException e) {
Log.i("file2", "上传失败-->" + e.getMessage());
String msg = e.getMessage();
if (msg == null || msg.equals("timeout")) {
onError(listener, "网络不稳定请求超时!");
} else {
onError(listener, e.getMessage());
}
call.cancel();//上传失败取消请求释放内存
}
});
}
//注意:添加手机图片,别忘了添加SD卡权限
5.全部代码:
public class HttpUtil {
private static final Handler handler = new Handler(Looper.getMainLooper());
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");
private static final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain
.request()
.newBuilder()
.build();
return chain.proceed(request);
}
})
.readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(10, TimeUnit.SECONDS)//设置写的超时时间
.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
.build();
/**
* 实例--》添加商品
*/
public static void addCoupon( int shopperId,String shopperName,
File file, final UIDataListener listener) {
String url = "shopappajx/shopAppCouponAction_saveCoupon.htm";
Map<String, Object> map = new HashMap<>();
map.put("shopperId", shopperId);
map.put("shopperName", shopperName);
map.put("couponImage", file);//商品图片
uploadImgAndParameter(map, url, listener);
}
//上传图片共有方法
private synchronized final static void uploadImgAndParameter(Map<String, Object> map, String url,
final UIDataListener listener) {
// mImgUrls为存放图片的url集合
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
if (null != map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() != null) {
if (entry.getValue() instanceof File) {
File f = (File) entry.getValue();
builder.addFormDataPart(entry.getKey(), f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
} else {
builder.addFormDataPart(entry.getKey(), entry.getValue().toString());
}
}
}
}
//创建RequestBody
RequestBody body = builder.build();
// MultipartBody requestBody = builder.build();
//构建Request请求
final Request request = new Request.Builder()
.url(url)//地址
.post(body)//添加请求体
// .post(requestBody)//添加请求体
.build();
client.newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {//判断是否成功
final String data = response.body().string();//string()仅可调用一次。否则报IllegalStateException: closed异常
Log.i("file1", "上传照片成功-->" + data);
onSuccess(listener, data);
call.cancel();//上传成功取消请求释放内存
}
}
@Override
public void onFailure(Call call, final IOException e) {
Log.i("file2", "上传失败-->" + e.getMessage());
String msg = e.getMessage();
if (msg == null || msg.equals("timeout")) {
onError(listener, "网络不稳定请求超时!");
} else {
onError(listener, e.getMessage());
}
call.cancel();//上传失败取消请求释放内存
}
});
}
private final static void onSuccess(final UIDataListener listener, final String data) {
handler.post(new Runnable() {
public void run() {
// 需要在主线程的操作。
listener.onSuccess(data);
}
});
}
private final static void onError(final UIDataListener listener, final String msg) {
if (null != listener) {
handler.post(new Runnable() {
public void run() {
// 需要在主线程的操作。
listener.onFailure(msg);
}
});
}
}
public interface UIDataListener {
//网络请求成功
void onSuccess(String data);
//网络请求失败
void onFailure(String errorMassage);
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# retrofit
# 图文上传
# retrofit实现图片上传
# retrofit上传文件
# 简略分析Android的Retrofit应用开发框架源码
# Android网络请求框架Retrofit详解
# 详解Retrofit2.0 公共参数(固定参数)
# Android Retrofit的简单介绍和使用
# Android Retrofit的使用详解
# Retrofit 源码分析初探
# Retrofit自定义请求参数注解的实现思路
# 上传
# 不稳定
# 上传图片
# 判断是否
# 上传照片
# 别忘了
# 中都
# 传了
# proceed
# readTimeout
# TimeUnit
# SECONDS
# return
# Request
相关文章:
七夕网站制作视频,七夕大促活动怎么报名?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何快速搭建响应式可视化网站?
相册网站制作软件,图片上的网址怎么复制?
如何在IIS中新建站点并配置端口与物理路径?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
如何通过虚拟机搭建网站?详细步骤解析
建站主机类型有哪些?如何正确选型
C#怎么使用委托和事件 C# delegate与event编程方法
,怎么在广州志愿者网站注册?
如何快速选择适合个人网站的云服务器配置?
图册素材网站设计制作软件,图册的导出方式有几种?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
小程序网站制作需要准备什么资料,如何制作小程序?
建站主机功能解析:服务器选择与快速搭建指南
建站之星图片链接生成指南:自助建站与智能设计教程
如何用wdcp快速搭建高效网站?
代购小票制作网站有哪些,购物小票的简要说明?
三星网站视频制作教程下载,三星w23网页如何全屏?
建站之星安装需要哪些步骤及注意事项?
如何快速搭建二级域名独立网站?
如何选择域名并搭建高效网站?
内部网站制作流程,如何建立公司内部网站?
网站制作话术技巧,网站推广做的好怎么话术?
如何选择建站程序?包含哪些必备功能与类型?
建站org新手必看:2024最新搭建流程与模板选择技巧
购物网站制作公司有哪些,哪个购物网站比较好?
网站制作免费,什么网站能看正片电影?
建站之星如何实现五合一智能建站与营销推广?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
股票网站制作软件,网上股票怎么开户?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
建站主机是什么?如何选择适合的建站主机?
郑州企业网站制作公司,郑州招聘网站有哪些?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何在云指建站中生成FTP站点?
javascript中对象的定义、使用以及对象和原型链操作小结
如何在阿里云购买域名并搭建网站?
模具网站制作流程,如何找模具客户?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何选择网络建站服务器?高效建站必看指南
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何彻底删除建站之星生成的Banner?
高性价比服务器租赁——企业级配置与24小时运维服务
如何零基础开发自助建站系统?完整教程解析
*请认真填写需求信息,我们会在24小时内与您取得联系。