Retrofit图片上传及进度的显示
一、关于图片上传
以前接触过的图片上传,没有使用框架,是直接通过接口跟服务器交互的状态,先将图片转成base64String,然后添加到json当中,再通过接口发送给服务器,当时单张图片还好说,如果是多张而且大小不小的话,传输就相当慢了,现在接触到的retrofit,上传文件,当然包括图片,提供了自己的方法,上传单张和多张的速度很快,效率得到了大大的提升而;
二、实现文件上传
接口的编写,是以post请求的方式提交,ImageReturnBean是服务器返回的上传结果,@Part(“userid”) String userid则是上传文件时携带的参数id, PartMap 作为存放需要上传的文件的集合;
/*** 图片上传* @return*/@Multipart@POST("uploadimage")Call<ImageReturnBean> uploadFiles(@Part("userid") String userid,@PartMap Map<String, RequestBody> params);
接下来是图片上传的请求,UploadFileRequestBody是我们自己封装,将文件添加到RequestBody中,这里在后面解释, params.put(“test” + i + “\”; filename=\”” + file.getName(), fileRequestBody);添加文件的键以及值RequestBody,在遍历图片文件的同时生成对应的body,添加到集合中;
Retrofit retrofit = new Retrofit.Builder().baseUrl(HttpUtil.loadLoginUrl).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
APIService service = retrofit.create(APIService.class);
Map<String, RequestBody> params = new HashMap<>();
for (int i = 0; i < imageList.size(); i++) {File file = new File(imageList.get(i)); UploadFileRequestBody fileRequestBody = new UploadFileRequestBody(file, new DefaultProgressListener(myHandler, 1, imageList.size()));params.put("test" + i + "\"; filename=\"" + file.getName(), fileRequestBody);}
Call<ImageReturnBean> observable = service.uploadFiles(resultsBean.getUserid(),params);
observable.enqueue(new Callback<ImageReturnBean>() {@Overridepublic void onResponse(Response<ImageReturnBean> response, Retrofit retrofit) {progressDialog.dismiss();Log.e("上传成功", "" + ((ImageReturnBean) response.body()).getMsg());}@Overridepublic void onFailure(Throwable t) {progressDialog.dismiss();Log.e("上传失败", "上传失败");}});}
});
下面我们来看看自己封装的RequestBody类
public class UploadFileRequestBody extends RequestBody {private RequestBody mRequestBody;private ProgressListener mProgressListener;private BufferedSink bufferedSink;public UploadFileRequestBody(File file, ProgressListener progressListener) {this.mRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);this.mProgressListener = progressListener;}public UploadFileRequestBody(RequestBody requestBody, ProgressListener progressListener) {this.mRequestBody = requestBody;this.mProgressListener = progressListener;}//返回了requestBody的类型,想什么form-data/MP3/MP4/png等等等格式@Overridepublic MediaType contentType() {return mRequestBody.contentType();}//返回了本RequestBody的长度,也就是上传的totalLength@Overridepublic long contentLength() throws IOException {return mRequestBody.contentLength();}@Overridepublic void writeTo(BufferedSink sink) throws IOException {if (bufferedSink == null) {//包装bufferedSink = Okio.buffer(sink(sink));}//写入mRequestBody.writeTo(bufferedSink);//必须调用flush,否则最后一部分数据可能不会被写入bufferedSink.flush();}private Sink sink(Sink sink) {return new ForwardingSink(sink) {//当前写入字节数long bytesWritten = 0L;//总字节长度,避免多次调用contentLength()方法long contentLength = 0L;@Overridepublic void write(Buffer source, long byteCount) throws IOException {super.write(source, byteCount);if (contentLength == 0) {//获得contentLength的值,后续不再调用contentLength = contentLength();}//增加当前写入的字节数bytesWritten += byteCount;//回调上传接口mProgressListener.onProgress(bytesWritten, contentLength, bytesWritten == contentLength);}};}
}
给出回调的上传接口:
public interface ProgressListener {void onProgress(long hasWrittenLen, long totalLen, boolean hasFinish);
}
我们定义一个类实现这个监听的接口
public class DefaultProgressListener implements ProgressListener {private Handler mHandler;private int size;//多文件上传时,index作为上传的位置的标志private int mIndex;public DefaultProgressListener(Handler mHandler, int mIndex, int size) {this.mHandler = mHandler;this.mIndex = mIndex;this.size = size;}@Overridepublic void onProgress(long hasWrittenLen, long totalLen, boolean hasFinish) {System.out.println("----the current " + hasWrittenLen + "----" + totalLen + "-----" + (hasWrittenLen * 100 / totalLen));int percent = (int) (hasWrittenLen * 100 / totalLen);if (percent > 100) percent = 100;if (percent < 0) percent = 0;if (percent == 100) {Constant.LASTSIZE += percent / size;}Message msg = Message.obtain();if ((Constant.LASTSIZE + percent / size) > 100) {msg.what = 100;} else {msg.what = Constant.LASTSIZE + percent / size;}msg.arg1 = mIndex;//这里因为有多张图片,二一开始进度只是单张的,所以根据图片的size计算总的进度;if (Constant.LOADSIZE < msg.what) {Constant.LOADSIZE = msg.what;mHandler.sendMessage(msg);}}
}
最后在更新界面接受消息后更新UI
private Handler myHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.arg1) {case 1:if (msg.what > 0) {Log.e("上传进度", "=" + msg.what + "%");mFirstBar.setProgress(msg.what);tv_progress.setText(msg.what + "%");}break;}}};
“`
Retrofit图片上传及进度的显示相关推荐
- php 图片 投稿 源码,php图片上传,审核,显示源码(转载)
php图片上传,审核,显示源码(转载) 最近想为http://gif.nbqq.net,加一个网友可以自主上传的页面,然后我审核.所以百度了下源码先.下午好好研究下. 首先来看下上传部分的表单代码: ...
- jquery PHP大文件上传,Jquery和BigFileUpload实现大文件上传及进度条显示
实现方法:用到了高山来客 的bigfileupload组件,用高山来客的方法,弹出一个模式窗口,然后不停刷新获取进度,始终觉得体验感不好,于是想到用jquery来实现无刷新进度显示,因为提交页面后, ...
- html实现图片上传到浏览器并显示
方法一 利用原生js实现图片上传 上传文件时,需要设置请求头,一般请求头是json格式,一般文件的请求数据是formdata类型,所以需要设置请求头Content-Type:multipart/for ...
- php图片上传功能,实时显示上传的图片
工作中总会有需要自己写前端上传图片功能,特意保留一下自己感觉还好的前端上传图片代码 主要介绍了PHP上传图片显示缩略图功能代码, 前端html代码 <input type="hidde ...
- MVC 图片上传 带进度条(转)
MVC 图片上传小试笔记 form.js 这个插件已经是很有名的,结合MVC的html辅助方法异步上传就很简单了.jQuery Form Plugin :http://www.malsup.com/j ...
- 选择相册图片上传后,客户端显示图片却是被旋转过角度
我想某位大哥也遇到过这个问题,就是手机相册选择图片时,显示是正的(未被旋转角度的),但是上传该图片后,客户端却显示被旋转了xx度的.那这肯定是客户不想出现的问题,同样也是我们开发者不想出现bug.我想 ...
- 【小程序】关于图片上传和在页面显示问题
最近在工作中遇到一个关于图片上传的问题.根据之前项目的经验,我知道目前这个公司上传图片有两种方式, 一种是把图片上传到公司服务器上,然后把图片放在服务器上的地址存在数据库中,要获得图片的时候直接从库中 ...
- java下传图片到tomcat服务器后,如何在页面显示,java图片上传服务器及客户端显示图片...
我在上一篇文章SSM+Layui实现文件上传服务器中展示了如何将图片上传至服务器,保存到SQL server数据库中,本篇文章主要讲的是将图片上传到服务器上,保存在服务器的磁盘上,然后将图片路径保存到 ...
- html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...
展开全部 有两种方法一是用上传的组建jspSmartUpload的Request, 还有一种不用组建,但在e69da5e6ba9062616964757a686964616f3133323865323 ...
最新文章
- 【直播预告】云栖直播:阿里热修复产品HotFix2.0升级详解
- 【Linux笔记(001) 】-- centos7 系统目录结构与文件
- 创建一个学生信息表,与页面分离
- memcpy函数实现_等比例缩放c++ opencv 实现
- alert 标题_[SwiftUI 知识碎片] Button、Image 和 Alert
- 后端架构高可用可伸缩
- php 访问类的属性,PHP OOP如何访问类的父属性范围解析运算符(::)?
- js中的数组和字符串的一些方法
- 设计模式---代理模式(c++实现)
- 员工收“老板”QQ消息转账98万 警方挽回被骗资金
- 自己编写的中文字符串的截取函数
- java隐式参数的作用_隐式参数_scala教程_田守枝Java技术博客
- 壁面函数matlab,Y+的查看及FLUENT壁面函数的选择
- 万网域名修改 DNS 方法
- 4.7开发者日:创业工场麦刚认为创业者活下去最重要
- mysql运维备份_MySQL运维经验
- 如何运用好夜间旅游项目的地域文化元素
- 关于基线版本、基线那点事儿
- 要点初见:OpenCL 2.0 异构计算 [第三版] 知识点整理
- Python一些可能用的到的函数系列76 最大回撤率
热门文章
- ASP.NET之“Jbh.Common.DbHelperSQL”不实现接口成员“System.IDisposable.Dispose()”
- nyoj 118 修路方案
- 云盘网盘系统源码快速对接多家云存储(带视频搭建教程)
- Spring Cloud Gateway系列【4】初始化加载流程源码解析
- Windows 2000 中文版造字
- 呼叫中心客服系统如何搭建?
- 汉风联运iOS SDK文档说明
- cdo收取邮件_利用CDO实现邮件回执功能
- cdo 发送html,vba调用cdo发送邮件(qq邮箱)
- python实现按照文件名称进行文件分类