OKHttp实现多文件上传
开发中有时有这么一个需求,要求对文件进行上传或下载,但是在上传或者下载前,你需要给用户一个友好的提示,在上传或者下载中,你需要将进度展示给用户,下载或者完成后提示用户下载完成。
这里给出服务器端(我用的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实现多文件上传相关推荐
- OkHttp实现文件上传进度
文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码 import com.squareup.okhttp.*; ...
- httpclient base64 文件上传_选择HttpClient还是OkHttp?
来源:https://urlify.cn/IBbMRn 写在前面 为什么会写这篇文章,起因于和朋友的聊天 这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okht ...
- java post上传进度,OkHttp实现文件上传进度
文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码 import com.squareup.okhttp.*; ...
- 基于OkHttp 、Retrofit 、Volley 、RxJava、Novate多种网络框架整合的快速项目开发框架,一行代码实现Ftp文件上传、文件下载、文件删除和进度监听的工具类的使用
基于OkHttp .Retrofit .Volley .RxJava.Novate多种网络框架整合的快速项目开发框架,Ftp文件上传.文件下载的工具类的使用. 依赖于Ftp的jar包,对上传.下载.删 ...
- Android OkHttp+RxJava 史上最优雅的实现文件上传/下载进度的监听
本文已授权「刘望舒」微信公众号独家原创发布 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步 RxHttp 一条 ...
- 大文件上传服务器:支持超大文件HTTP断点续传的实现办法
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/ababab12345/a ...
- Retrofit2 multpart多文件上传详解
原文出处:http://www.chenkaihua.com/2016/04/02/retrofit2-upload-multipart-files.html Retrofit2是目前很流行的andr ...
- java上传视频到七牛云_Java进阶学习:将文件上传到七牛云中
Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...
- android http文件上传,Android Http文件上传方法和实践
文件上传在应用中是比较常用的的一种功能,比如用户的意见反馈功能.用户可以上传图片,音视频等文件,方便用户反馈问题的情况. 下来我将和大家一起梳理下需要掌握的知识,少走弯路一步到位,实现文件上传功能. ...
最新文章
- MyBatis 一个简单配置搞定数据加密解密!
- 为何大多数人做出来的图表只是一坨屎?
- python浪漫代码-python爱心表白 每天都是浪漫七夕!
- PowerDesigner使用方法入门学习
- 品质标签分几种颜色_小标签大学问,如何给实验室仪器贴标签?
- 在EXE和DLL中,FindResource的区别
- 1.2 Java系统流
- 嵌套For循环性能优化
- 【codevs1298】凸包周长,计算几何
- brctl 设置ip_docker配置独立桥接IP的方法
- 大数据分析平台在企业的重要性
- 微信这项功能即将下线,赶快导出数据!
- 磁盘设置压缩导致无法将数据库还原到该硬盘的问题
- 安全哈希算法SHA1
- 必须收藏!没有经验的程序员该怎么找工作?
- PRD:腾讯会议APP产品需求文档
- ps html 优化,photoshop越用越卡的解决方法,ps性能优化教程
- STC-B学习板单片机编程
- Win10 分页缓冲池 过大
- 由ANSI标准定义的C语言关键字,C语言32个关键字详解