开发中有时有这么一个需求,要求对文件进行上传或下载,但是在上传或者下载前,你需要给用户一个友好的提示,在上传或者下载中,你需要将进度展示给用户,下载或者完成后提示用户下载完成。

这里给出服务器端(我用的jsp)和Android客户端的代码的github地址

JSP服务器端
https://github.com/zhouxu88/UploadFileWebDemo.git
Android客户端
https://github.com/zhouxu88/OkHttp3_UploadFile.git

一、多文件上传(不带进度)

生成RequestBody

 /*** 通过上传的文件的完整路径生成RequestBody* @param fileNames 完整的文件路径* @return*/private static RequestBody getRequestBody(List<String> fileNames) {//创建MultipartBody.Builder,用于添加请求的数据MultipartBody.Builder builder = new MultipartBody.Builder();for (int i = 0; i < fileNames.size(); i++) { //对文件进行遍历File file = new File(fileNames.get(i)); //生成文件//根据文件的后缀名,获得文件类型String fileType = getMimeType(file.getName());builder.addFormDataPart( //给Builder添加上传的文件"image",  //请求的名字file.getName(), //文件的文字,服务器端用来解析的RequestBody.create(MediaType.parse(fileType), file) //创建RequestBody,把上传的文件放入);}return builder.build(); //根据Builder创建请求}

生成Request

/*** 获得Request实例* @param url* @param fileNames 完整的文件路径* @return*/private static Request getRequest(String url, List<String> fileNames) {Request.Builder builder = new Request.Builder();builder.url(url).post(getRequestBody(fileNames));return builder.build();}

上传文件

/*** 根据url,发送异步Post请求* @param url 提交到服务器的地址* @param fileNames 完整的上传的文件的路径名           * @param callback OkHttp的回调接口*/
public static void upLoadFile(String url,List<String> fileNames,Callback callback){OkHttpClient okHttpClient = new OkHttpClient();Call call = okHttpClient.newCall(getRequest(url,fileNames)) ;call.enqueue(callback);
}

二、多文件上传(带进度值)

由于对进度的处理,比较复杂,此处只做使用的介绍,具体的实现可在github上查看

1、对于进度已经封装成libary,直接调用即可
2、带进度的多文件上传的调用如下

MainActivity:(关键代码)


//提交文件到服务器的地址(使用的时候替换成自己的服务器地址)private static final String POST_FILE_URL = "http://192.168.1.3:8080/UploadFileDemo/MutilUploadServlet";private ProgressBar uploadProgress, downloadProgeress;private TextView uploadTV,downloadTv;//多文件上传(带进度)private void upload() {//这个是非ui线程回调,不可直接操作UIfinal ProgressListener progressListener = new ProgressListener() {@Overridepublic void onProgress(long bytesWrite, long contentLength, boolean done) {Log.i("TAG", "bytesWrite:" + bytesWrite);Log.i("TAG", "contentLength" + contentLength);Log.i("TAG", (100 * bytesWrite) / contentLength + " % done ");Log.i("TAG", "done:" + done);Log.i("TAG", "================================");}};//这个是ui线程回调,可直接操作UIUIProgressListener uiProgressRequestListener = new UIProgressListener() {@Overridepublic void onUIProgress(long bytesWrite, long contentLength, boolean done) {Log.i("TAG", "bytesWrite:" + bytesWrite);Log.i("TAG", "contentLength" + contentLength);Log.i("TAG", (100 * bytesWrite) / contentLength + " % done ");Log.i("TAG", "done:" + done);Log.i("TAG", "================================");//ui层回调,设置当前上传的进度值int progress = (int) ((100 * bytesWrite) / contentLength);uploadProgress.setProgress(progress);uploadTV.setText("上传进度值:" + progress + "%");}//上传开始@Overridepublic void onUIStart(long bytesWrite, long contentLength, boolean done) {super.onUIStart(bytesWrite, contentLength, done);Toast.makeText(getApplicationContext(),"开始下载",Toast.LENGTH_SHORT).show();}//上传结束@Overridepublic void onUIFinish(long bytesWrite, long contentLength, boolean done) {super.onUIFinish(bytesWrite, contentLength, done);//uploadProgress.setVisibility(View.GONE); //设置进度条不可见Toast.makeText(getApplicationContext(),"下载结束",Toast.LENGTH_SHORT).show();}};//开始Post请求OKHttpUtils.doPostRequest(POST_FILE_URL, initUploadFile(), uiProgressRequestListener, new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.i("TAG", "error------> "+e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.i("TAG", "success---->"+response.body().string());}});//初始化上传文件的数据private List<String> initUploadFile(){List<String> fileNames = new ArrayList<>();fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "test.txt"); //txt文件fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "bell.png"); //图片fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)+ File.separator + "kobe.mp4"); //视频fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+ File.separator + "xinnian.mp3"); //音乐return fileNames;}}

效果图

OKHttp实现多文件上传相关推荐

  1. OkHttp实现文件上传进度

    文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码 import com.squareup.okhttp.*; ...

  2. httpclient base64 文件上传_选择HttpClient还是OkHttp?

    来源:https://urlify.cn/IBbMRn 写在前面 为什么会写这篇文章,起因于和朋友的聊天 这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okht ...

  3. java post上传进度,OkHttp实现文件上传进度

    文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码 import com.squareup.okhttp.*; ...

  4. 基于OkHttp 、Retrofit 、Volley 、RxJava、Novate多种网络框架整合的快速项目开发框架,一行代码实现Ftp文件上传、文件下载、文件删除和进度监听的工具类的使用

    基于OkHttp .Retrofit .Volley .RxJava.Novate多种网络框架整合的快速项目开发框架,Ftp文件上传.文件下载的工具类的使用. 依赖于Ftp的jar包,对上传.下载.删 ...

  5. Android OkHttp+RxJava 史上最优雅的实现文件上传/下载进度的监听

    本文已授权「刘望舒」微信公众号独家原创发布 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步 RxHttp 一条 ...

  6. 大文件上传服务器:支持超大文件HTTP断点续传的实现办法

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/ababab12345/a ...

  7. Retrofit2 multpart多文件上传详解

    原文出处:http://www.chenkaihua.com/2016/04/02/retrofit2-upload-multipart-files.html Retrofit2是目前很流行的andr ...

  8. java上传视频到七牛云_Java进阶学习:将文件上传到七牛云中

    Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...

  9. android http文件上传,Android Http文件上传方法和实践

    文件上传在应用中是比较常用的的一种功能,比如用户的意见反馈功能.用户可以上传图片,音视频等文件,方便用户反馈问题的情况. 下来我将和大家一起梳理下需要掌握的知识,少走弯路一步到位,实现文件上传功能. ...

最新文章

  1. MyBatis 一个简单配置搞定数据加密解密!
  2. 为何大多数人做出来的图表只是一坨屎?
  3. python浪漫代码-python爱心表白 每天都是浪漫七夕!
  4. PowerDesigner使用方法入门学习
  5. 品质标签分几种颜色_小标签大学问,如何给实验室仪器贴标签?
  6. 在EXE和DLL中,FindResource的区别
  7. 1.2 Java系统流
  8. 嵌套For循环性能优化
  9. 【codevs1298】凸包周长,计算几何
  10. brctl 设置ip_docker配置独立桥接IP的方法
  11. 大数据分析平台在企业的重要性
  12. 微信这项功能即将下线,赶快导出数据!
  13. 磁盘设置压缩导致无法将数据库还原到该硬盘的问题
  14. 安全哈希算法SHA1
  15. 必须收藏!没有经验的程序员该怎么找工作?
  16. PRD:腾讯会议APP产品需求文档
  17. ps html 优化,photoshop越用越卡的解决方法,ps性能优化教程
  18. STC-B学习板单片机编程
  19. Win10 分页缓冲池 过大
  20. 由ANSI标准定义的C语言关键字,C语言32个关键字详解

热门文章

  1. 云扩科技受邀出席苏信会CIO沙龙,RPA赋能制造业转型升级
  2. 海思3716C平台添加m88dc2800+高斯贝尔(EN4020)tuner驱动总结
  3. 运维利器万能的 strace
  4. 从零开始入门创作游戏——Unity3d的环境搭建
  5. 【百度】什么样的女人容易出轨
  6. sustech solidowrks
  7. 网站使用第三方登录--用新浪博客登录
  8. 数据库管理-第二十期(20210304)
  9. 锁9---自旋锁 VS 适应性自旋锁
  10. c语言冒泡排序数组指针,c语言冒泡排序,指针,数组