Retrofit实现文件上传和下载【二】

2023-11-16

概述

通过前一篇的博客介绍,我们已经对Retrofit的使用有了一个大概的了解,今天来讲讲利用Retrofit进行文件的上传和下载

文件上传

服务器使用的是SSH框架,因此这里是以struts2的方式来获取数据的,我这里定义了三个字段用来接收上传过来的数据

private File file;//获取单个文件
private File[] files;//获取多个文件
private String description;

单文件上传

先定义咱们的接口

@Multipart
@POST("user!getFile")
//description表示key
Call<RequestBody> upFile(@Part("description") RequestBody description, @Part MultipartBody.Part file);

解释:@Multipart表示请求发送multipart数据,需要配合@Part一起使用,MultipartBody.Part用来封装需要上传的文件,RequestBody用来封装一段文字

下面来看看具体实现

 //把file封装到RequestBody中
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), files[0]);
//再把RequestBody封装到MultipartBody.Part中,第一个参数file就是和服务器约定的key
MultipartBody.Part body = MultipartBody.Part.createFormData("file", files[0].getName(), requestFile);
String descriptionString = "hello, 这是文件描述";
RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
Call<RequestBody> call = fileService.upFile(description, body);

多文件上传

在介绍多文件上传前,先对RequestBody、MultipartBody、MultipartBody.Builder、MultipartBody.Part这几个类作一个简单说明,方便我们对下面的代码有一个清晰的认识

1.RequestBody是MultipartBody的父类
2.MultipartBody.Part通过createXXX方法来创建请求用的数据
3.MultipartBody.Part可以传入RequestBody对象来创建请求用的数据
4.MultipartBody.Builder可以添加多个MultipartBody.Part
5.通过MultipartBody.Builder的build()方法返回MultipartBody对象
6.RequestBody的create(MediaType contentType, File file)方法,把File封装到请求体中
详细内容可以去看看okhttp的API

多文件的上传大致有三种形式:
1.第一种方法(太Low不可取)

@Multipart
@POST("user!getFiles")
Call<RequestBody> upFile(@Part("description") RequestBody description, @Part MultipartBody.Part file1,@Part MultipartBody.Part file2,@Part MultipartBody.Part file3);

这种实现方式和单文件差不多,这里就不再赘述了
2.第二种方法

@Multipart
@POST("user!getFiles")
Call<RequestBody> upFiles(@Part("files") MultipartBody files);
@Multipart
@POST("user!getFiles")
Call<RequestBody> upFiles(@Part("files") RequestBody files);

解释:这两种形式其实就是一种啦,下面介绍MultipartBody的实现方式,files对应服务器里的key

MultipartBody.Builder builder = new MultipartBody.Builder();
for(int i = 0; i < files.length; ++i){
    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), files[i]);
    builder.addFormDataPart("file", files[i].getName(), requestFile);
}
Call<RequestBody> call = fileService.upFiles(builder.build());

解释:这里的file不是服务器的key
3.第三种方法

@Multipart
@POST("user!getFiles")
Call<RequestBody> upFiles(@PartMap Map<String,RequestBody> files);

Map里的String里存了key,但不仅仅有Key,还包括了别的

Map<String, RequestBody> map = new HashMap<>();
for (int i = 0; i < files.length; ++i) {
    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), files[i]);
    //files 对应服务器那边的key,具体写法就是下面这种形式
    map.put("files\"; filename=\"" + files[i].getName(), requestFile);
}
Call<RequestBody> call = fileService.upFiles(map);

文件下载

@GET("user!downloadFile")
//需要注意这里传入的是ResponseBody而不是之前的RequestBody
Call<ResponseBody> downloadFile();

具体实现和普通请求差不多,最后通过response.body().byteStream()获取到InputStream以后,通过流的方式把文件写到本地,需要注意的是当文件过大的时候,需要在下载文件的方法上添加@Streaming注解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Retrofit实现文件上传和下载【二】 的相关文章

  • <微机与接口技术>51单片机的指令系统——数据传送与交换指令

    重要指令符号 Rn 当前工作寄存器组中的R0 R7 Ri 当前工作寄存器组中的R0 R1 rel 相对偏移量 在相对转移指令中使用 位一字节补码 寻址方式 七种分别是立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址
  • 超详细的springBoot学习教程

    springBoot学习 https docs spring io spring boot docs 2 2 6 RELEASE reference html index html 官方文档 1 搭建springBoot项目架构 2 spr
  • C#执行JavaScript脚本

    目录 安装和配置 执行 JavaScript 脚本 与脚本交互 JS 调用 C 方法 多线程使用 总结 ClearScript 是一个 NET 平台下的开源库 用于在 C 和其他 NET 语言中执行脚本代码 它提供了一种方便和安全的方法来将
  • Windows操作系统知识合集

    Windows操作系统的权限 Guest权限 User权限 人类可用普通权限 Administrator 人类可用最高权限的用户 System 系统 机器可用最高权限 比人类权限高更多 TrustInstaller 操作系统的最高权限 比S
  • Aggressive cows-疯牛POJ(2456)-详解

    描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000 000 但是 John的C 2 lt C lt N 头牛们并不喜欢这
  • verilog-mode的简要介绍

    verilog mode是什么 官网的介绍 https www veripool org wiki verilog mode Verilog mode el is the extremely popular free Verilog mod
  • 静态代理模式

    1 所谓的静态代理模式应该就是把大家都会做的相同的事情交给代理去做 2 而一定要自己做的事就在代理中传入一个自己的对象再在代理的类中的该方法中调用自己的方法 3 将所有需要自己完成的方法放在一个接口中然后自己和代理都去继承他 代理还会添加一
  • invalid resource directory name

    遇到错误 当有res navigation的时候 反编译打包回apk的时候会报错 invalid resource directory name res navigation 或者是 invalid resource directory n
  • 【CV】第 15 章:结合计算机视觉和 NLP 技术

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pc微信禁止启动小程序

    场景 最近 Windows 微信的更新了可以访问小程序的功能 但还不完善 如 尝试播放激励视频时 会直接跳过视频并作为已完成处理等 身为开发者的我们可能需要做一些处理 禁止pc的微信访问小程序 以达到减小损失的目的 提要 App onLau
  • Google Cast(Chromecast)浏览器 SDK 学习笔记(一)

    前几天因为京东打折 买了个索尼的 SRS X77 音箱 看说明书说支持 Google Cast 试了试感觉还挺好用 于是研究了一下 Google Cast 的 SDK Chromecast Google Cast 傻傻分不清楚 Google
  • Python迭代器及其用法

    列表 list 元组 tuple 字典 dict 集合 set 这些序列式容器有一个共同的特性 它们都支持使用 for 循环遍历存储的元素 都是可迭代的 因此它们又有一个别称 即迭代器 从字面来理解 迭代器指的就是支持迭代的容器 更确切的说
  • Umi4各种运行报错排查

    使用 Umi4 搭建项目 选择antd pro模版 pnpm 运行起来以后VScode编译器中出现报红 但是项目正常运行 现在强迫症处理各种报红 如果有用请点个赞 o 1 Cannot find module umi or its corr

随机推荐

  • windows平台对NUMA的支持

    微软官网链接 https docs microsoft com en us windows win32 procthread numa support 译文如下 多处理器支持的传统模型是对称多处理器 SMP 在这种模型中 每个处理器对内存和
  • go mod 引入指定的分支

    方式一 执行以下命令 go get git地址 分支名 如 go get github com golang go master 方式二 直接在go mod文件中添加 格式如下 git地址 v0 0 0 时间戳 commint id 例如
  • webpack静态资源地址注入html,HtmlWebpackPlugin

    说明 插件的基本作用就是生成 html 文件 原理很简单 将 webpack 中entry配置的相关入口 chunk 和 extract text webpack plugin抽取的 css 样式 插入到该插件提供的template或者te
  • 拼多多电商玩家快速采集平台数据

    作为电商卖家 选款是一件很重要的事情 所以我们在选款上面需要下大功夫分析数据 如何第一时间知晓同类商品及其价格 如何实时采集到新款 爆款 及其价格 下面我对比两种方法 看看哪种方式更适合我们普通电商从业人员 目标 抓取拼多多某类商品的列表页
  • 学习Python数据分析有什么用?

    在当今信息爆炸的时代 数据成为了各行各业中不可或缺的资源 而Python作为一种高级编程语言 拥有强大的数据分析能力 本文将详细介绍学习Python数据分析的重要性以及它在实际应用中的用途 帮助读者更好地了解并学习Python数据分析 一
  • 基于ARIMA-CNN-LSTM预测模型研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 A IMA 模型 1 2 CNN LSTM 模型 2 运行结果 3 参考文献 4 Python代码
  • 使用SDWAN构建安全的混合WAN

    使用SD WAN构建安全的混合WAN SDWAN的爆炸已成为头条新闻了一年多 企业正在以惊人的速度采取SDWAN 不但可以为分支机构提供更灵活的连接和利用程序性能 而且可以跨全部网络提供 远程 超级用户 依托SDWAN 通过将小型台式机装备
  • 博途 V15.1安装步骤

    温馨提醒 安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5 3320M 3 3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15 6 宽屏显示 1920 x 1080 1 双击打开 Siemens v
  • 小程序代码提审用户隐私保护协议修改指引

    为规范开发者的用户个人信息处理行为 保障用户合法权益 小程序涉及处理用户个人信息的开发者 均需补充相应用户隐私保护指引 微信会根据小程序版本隐私接口调用情况展示必填项 开发者可自主勾选其他项目 一 代码提审版本用户隐私保护指引填写入口 管理
  • 用c99 写的简单线程池类

    include
  • [培训-DSP快速入门-6]:C54x DSP开发中C语言库函数的使用

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119010855 目录 第1章
  • 14 代码分割之lazy:Suspense与路由懒加载

    lazy内置方法 Suspense内置组件 lazy是React提供的懒 动态 加载组件的方法 React lazy 能减少打包体积 延迟加载首屏不需要渲染的组件 依赖内置组件Suspense 给lazy加上loading指示器组件的一个容
  • 【面试题】前端开发中如何高效渲染大数据量?

    前端面试题库 面试必备 推荐 地址 前端面试题库 国庆头像 国庆爱国 程序员头像 总有一款适合你 在日常工作中 较少的能遇到一次性往页面中插入大量数据的场景 数栈的离线开发 以下简称离线 产品中 就有类似的场景 本文将分享一个实际场景中的前
  • 一大波 Android 刘海屏来袭,全网最全适配技巧!

    一 序 Hi 大家好 我是承香墨影 Apple 一直在引领设计的潮流 自从 iPhone X 发布之后 刘海屏 就一直存在争议 不过不管你怎样 Android 也要跻入 刘海屏 的行列 尤其是 Android P 发布之后 也从系统级支持顶
  • mysql auto connect_Mysql autoReconnect 的问题

    MySQL官方不推荐使用autoReconnect true 参见 http bugs mysql com bug php id 5020 需要另外找别的办法来解决超过8小时 链接断开的问题 由于问题产生的根本原因在于服务到数据库的连接长时
  • mysql的workbench在哪_MySQL Workbench的使用方法(图文)

    MySQLWorkbench 是 MySQL AB 最近释放的可视数据库设计工具 这个工具是设计 MySQL数据库的专用工具 MySQLWorkbench 拥有很多的功能和特性 这篇由DjoniDarmawikarta 写的文章通过一个示例
  • JavaScript将一层级对象数组转为children嵌套的三层级树状对象数组(多级树状分类)

    有时候后端返回的数据不适合前端 我们就需要进行转换 比如我想用elementUI的级联选择器 而这个组件对数据格式有要求 本篇文章将介绍如何将一层级对象数组数据格式转为三层级嵌套children数组 JavaScript Vue 小程序等都
  • 信息学奥赛一本通 1240:查找最接近的元素

    题目链接 http ybt ssoier cn 8088 problem show php pid 1240 include
  • 数据库相关知识和进阶知识

    目录 MySQL与Orcale EXPLAIN介绍 EXPLAIN 可以分析慢查询原因 查看MySQL存储空间大小 MySQL事务锁不执行严格的校验
  • Retrofit实现文件上传和下载【二】

    概述 通过前一篇的博客介绍 我们已经对Retrofit的使用有了一个大概的了解 今天来讲讲利用Retrofit进行文件的上传和下载 文件上传 服务器使用的是SSH框架 因此这里是以struts2的方式来获取数据的 我这里定义了三个字段用来接