一、关于图片上传

以前接触过的图片上传,没有使用框架,是直接通过接口跟服务器交互的状态,先将图片转成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图片上传及进度的显示相关推荐

  1. php 图片 投稿 源码,php图片上传,审核,显示源码(转载)

    php图片上传,审核,显示源码(转载) 最近想为http://gif.nbqq.net,加一个网友可以自主上传的页面,然后我审核.所以百度了下源码先.下午好好研究下. 首先来看下上传部分的表单代码: ...

  2. jquery PHP大文件上传,Jquery和BigFileUpload实现大文件上传及进度条显示

    实现方法:用到了高山来客 的bigfileupload组件,用高山来客的方法,弹出一个模式窗口,然后不停刷新获取进度,始终觉得体验感不好,于是想到用jquery来实现无刷新进度显示,因为提交页面后, ...

  3. html实现图片上传到浏览器并显示

    方法一 利用原生js实现图片上传 上传文件时,需要设置请求头,一般请求头是json格式,一般文件的请求数据是formdata类型,所以需要设置请求头Content-Type:multipart/for ...

  4. php图片上传功能,实时显示上传的图片

    工作中总会有需要自己写前端上传图片功能,特意保留一下自己感觉还好的前端上传图片代码 主要介绍了PHP上传图片显示缩略图功能代码, 前端html代码 <input type="hidde ...

  5. MVC 图片上传 带进度条(转)

    MVC 图片上传小试笔记 form.js 这个插件已经是很有名的,结合MVC的html辅助方法异步上传就很简单了.jQuery Form Plugin :http://www.malsup.com/j ...

  6. 选择相册图片上传后,客户端显示图片却是被旋转过角度

    我想某位大哥也遇到过这个问题,就是手机相册选择图片时,显示是正的(未被旋转角度的),但是上传该图片后,客户端却显示被旋转了xx度的.那这肯定是客户不想出现的问题,同样也是我们开发者不想出现bug.我想 ...

  7. 【小程序】关于图片上传和在页面显示问题

    最近在工作中遇到一个关于图片上传的问题.根据之前项目的经验,我知道目前这个公司上传图片有两种方式, 一种是把图片上传到公司服务器上,然后把图片放在服务器上的地址存在数据库中,要获得图片的时候直接从库中 ...

  8. java下传图片到tomcat服务器后,如何在页面显示,java图片上传服务器及客户端显示图片...

    我在上一篇文章SSM+Layui实现文件上传服务器中展示了如何将图片上传至服务器,保存到SQL server数据库中,本篇文章主要讲的是将图片上传到服务器上,保存在服务器的磁盘上,然后将图片路径保存到 ...

  9. html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...

    展开全部 有两种方法一是用上传的组建jspSmartUpload的Request, 还有一种不用组建,但在e69da5e6ba9062616964757a686964616f3133323865323 ...

最新文章

  1. 【直播预告】云栖直播:阿里热修复产品HotFix2.0升级详解
  2. 【Linux笔记(001) 】-- centos7 系统目录结构与文件
  3. 创建一个学生信息表,与页面分离
  4. memcpy函数实现_等比例缩放c++ opencv 实现
  5. alert 标题_[SwiftUI 知识碎片] Button、Image 和 Alert
  6. 后端架构高可用可伸缩
  7. php 访问类的属性,PHP OOP如何访问类的父属性范围解析运算符(::)?
  8. js中的数组和字符串的一些方法
  9. 设计模式---代理模式(c++实现)
  10. 员工收“老板”QQ消息转账98万 警方挽回被骗资金
  11. 自己编写的中文字符串的截取函数
  12. java隐式参数的作用_隐式参数_scala教程_田守枝Java技术博客
  13. 壁面函数matlab,Y+的查看及FLUENT壁面函数的选择
  14. 万网域名修改 DNS 方法
  15. 4.7开发者日:创业工场麦刚认为创业者活下去最重要
  16. mysql运维备份_MySQL运维经验
  17. 如何运用好夜间旅游项目的地域文化元素
  18. 关于基线版本、基线那点事儿
  19. 要点初见:OpenCL 2.0 异构计算 [第三版] 知识点整理
  20. Python一些可能用的到的函数系列76 最大回撤率

热门文章

  1. ASP.NET之“Jbh.Common.DbHelperSQL”不实现接口成员“System.IDisposable.Dispose()”
  2. nyoj 118 修路方案
  3. 云盘网盘系统源码快速对接多家云存储(带视频搭建教程)
  4. Spring Cloud Gateway系列【4】初始化加载流程源码解析
  5. Windows 2000 中文版造字
  6. 呼叫中心客服系统如何搭建?
  7. 汉风联运iOS SDK文档说明
  8. cdo收取邮件_利用CDO实现邮件回执功能
  9. cdo 发送html,vba调用cdo发送邮件(qq邮箱)
  10. python实现按照文件名称进行文件分类