retrofit2上传、下载文件

一、上传文件

1、使用表单上传文件;结合Rxjava

先定义ApiService接口

@Multipart      //Multipart表单
@POST("{url}")   //post上传地址
Observable<ResponseBody> uploadFiles(@Path(value = "url",encoded = true) String url,@PartMap() Map<String, RequestBody> maps);    //请求body的map集合

组建请求体

//参数map
Map<String,RequestBody> paraMap = new HashMap<>();
//随文件一起上传的表单其他参数,备注,用户id等
paraMap.put("remark3",RequestBody.create(MediaType.parse("text/plain"), "备注"));
paraMap.put("userId", RequestBody.create(MediaType.parse("text/plain"), userId));
//文件1
File file = new File(filePath);
if(file.exists()) {//表单格式封装文件RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);//固定写法;其中"file1"是取文件名的key值,"filename"为固定写法,后面是原文件名;服务端获取到的文件为例如:file1=abc.txtparaMap.put("file1\"; filename=\"" + file.getName(), requestFile);
}
//再放一个文件
File file2 = new File(filePath);
if(file2.exists()) {//表单格式封装文件RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file2);//服务端获取到的文件为例如:file2=abc.txtparaMap.put("file2\"; filename=\"" + file2.getName(), requestFile);
}

开始上传

ApiService apiService = RxRetrofitClient.getApiService();
//method是后台接口方法名如"uploadImages",当前你已经封装了retrofit2的baseUrl
Observable<ResponseBody> uploadFileObervable = apiService.uploadFiles(method, images);

二、文件下载

定义retrofit2下载接口

/*** 下载文件,支持大文件下载* @param url 地址* @return 观察者*/
@Streaming     //使用流媒体
@GET
Observable<ResponseBody> downLoadFile(@NonNull @Url() String url);

文件下载方法

/*** 下载方法** @param url                  地址* @param destDir              存储文件夹* @param fileName             文件名称* @param fileDownLoadObserver 回调*/
public void downloadFile(String url, final String destDir, final String fileName, final FileDownLoadObserver<File> fileDownLoadObserver) {Disposable subscribe = RxRetrofitClient.getApiService().downLoadFile(url).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).observeOn(Schedulers.computation()).map(new Function<ResponseBody, File>() {@Overridepublic File apply(ResponseBody responseBody) throws Exception {return fileDownLoadObserver.saveFile(responseBody, destDir, fileName);}}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<File>() {@Overridepublic void accept(File file) throws Exception {fileDownLoadObserver.onDownLoadSuccess(file);}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {fileDownLoadObserver.onDownLoadFail(throwable);}}, new Action() {@Overridepublic void run() throws Exception {fileDownLoadObserver.onComplete();}});//管理请求生命周期addSubscribe(subscribe);
}

文件下载监听;

public abstract class FileDownLoadObserver<T> {//可以重写,具体可由子类实现public void onComplete() {}//下载成功的回调public abstract void onDownLoadSuccess(T t);//下载失败回调public abstract void onDownLoadFail(Throwable throwable);//下载进度监听public abstract void onProgress(int progress,long total);/*** 将文件写入本地* @param responseBody 请求结果全体* @param destFileDir 目标文件夹* @param destFileName 目标文件名* @return 写入完成的文件* @throws IOException IO异常*/public File saveFile(ResponseBody responseBody, String destFileDir, String destFileName) throws IOException {InputStream is = null;byte[] buf = new byte[2048];int len = 0;FileOutputStream fos = null;try {is = responseBody.byteStream();final long total = responseBody.contentLength();long sum = 0;File dir = new File(destFileDir);if (!dir.exists()) {dir.mkdirs();}File file = new File(dir, destFileName);fos = new FileOutputStream(file);while ((len = is.read(buf)) != -1) {sum += len;fos.write(buf, 0, len);final long finalSum = sum;onProgress((int) (finalSum * 100 / total),total);}fos.flush();return file;} finally {try {if (is != null) is.close();} catch (IOException e) {e.printStackTrace();}try {if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}}}}

2020-12-04使用retrofit上传下载文件,监听下载进度相关推荐

  1. 异步下载文件 java_在浏览器中异步下载文件监听下载进度

    在浏览器中异步下载文件,其实就是把服务器响应的文件先保存在内存中.然后再一次下载到磁盘.第二次下载过程,就是把内存的数据IO到磁盘,没有网络开销.速度极快. 之所以要先保存在内存,主要是可以在下载开始 ...

  2. js下载文件 监听下载完成事件

    <script src="xxx/layui/layui.js"></script> <script src="xxx/jquery.min ...

  3. 解决WordPress无法上传媒体文件以及无法下载和安装主题与插件的问题

    前言: 我的个人博客网站荒原之梦在安装成功WordPress之后本来是可以上传媒体文件,安装主题和插件的,但是后来不知道怎么回事就出了问题:不能上传媒体文件也不能安装主题和插件了.出现这个问题后我尝试 ...

  4. java实现文件上传和文件查看、下载

    在一个应用系统里,会有上传本地文件到系统服务器里或从系统服务器查看.下载有关文件到本地的需要.这里只对自己了解到的做一个总结 文件上传 这里是把本地文件上传到服务器文件目录,而不是放到项目目录里. 前 ...

  5. AIR文件上传与文件断点续传方式下载

    <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx= ...

  6. linux ftp去不了文件损坏,Linux下使用ftp上传压缩文件,windows下载打开损坏问题

    由于业务部门提出新的需求,需要在业务系统上进行修改,于是准备把生产环境上的系统下载到本地进行相应的修改(系统是第三方做的),服务器用的是CentOS6.3,由于安全问题,服务器的登录需要经过堡垒机,不 ...

  7. Linux下使用ftp上传压缩文件,windows下载打开损坏问题

    由于业务部门提出新的需求,需要在业务系统上进行修改,于是准备把生产环境上的系统下载到本地进行相应的修改(系统是第三方做的),服务器用的是CentOS6.3,由于安全问题,服务器的登录需要经过堡垒机,不 ...

  8. 微信公众号如何上传PPT文件【教程】

    公众号如何上传PPT文件给粉丝下载?相信这是很多做运营小编的困惑.公众号自身并不支持在公众号图文中上传文件,只支持在文章里添加图片.文字.视频号.小程序等内容,对于文件,并不支持.需要在公众号图文中上 ...

  9. xshell上传本地文件命令_linux学习 XShell上传、下载本地文件到linux服务器

    (一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...

  10. servlet实现文件上传,预览,下载和删除

    一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...

最新文章

  1. html 启动bat脚本,Windows开机自启动bat脚本设置方法
  2. Ceph:RBD在线扩容容量
  3. deepin终端配置为英文
  4. pandas 索引选取和过滤(四)
  5. oppo售后解锁工具_Realme X50/X50 Pro 5G版解锁BL获取完美ROOT权限全套详细刷机
  6. Linux怎么把目录设置群组,linux设置目录和文件使用权限
  7. jQuery操作CSS属性的相关方法
  8. macOS Big Sur无法安装 Big Sur为什么安装不了?
  9. 微信小程序-中英文文本换行的小问题
  10. emoji表情包整理好的
  11. 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)
  12. 003内部仓储物流的“降维打击”
  13. 新一轮众筹淘金热——DAOs
  14. 置换贴图,法线贴图,凹凸贴图的区别
  15. 微信和淘宝扫码登录背后的实现原理
  16. CART分类树原理及示例
  17. InstructGPT
  18. 微信转账怎么退回?别傻傻等待24小时自动退还了!
  19. Transformer课程 业务对话机器人Rasa 3.x 运行命令学习
  20. 欧几里得算法求两个正整数的最大公约数

热门文章

  1. opencv读取视频及打不开视频的解决方法
  2. 用java流复制文件不能复制全,少几十兆!!
  3. 大数据主要有什么用,有什么价值?
  4. DynamicDto链式实现动态数据传输对象
  5. java如何美化按钮_MFC实现漂亮界面之美化按钮
  6. 陇原战“疫“2021 复现Re
  7. 微信小程序和百度小程序的登录 wx.login() swan.login() , 以及存在的问题处理
  8. android 十六进制加密,使用十六进制十进制值的Android加密和解密?
  9. Kaggle竞赛——Titanic泰坦尼克之灾(0.76315==>0.79186)
  10. Python基础学习之 os 模块详解