广告
返回顶部
首页 > 资讯 > 精选 >Retrofit2.0怎么实现图文上传
  • 793
分享到

Retrofit2.0怎么实现图文上传

retrofit 2023-05-30 22:05:08 793人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关Retrofit2.0怎么实现图文上传,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近项目里用到了类似图文上传的功能,以前都是封装OkHttp的文件上传功能,这次想换个姿势,

这篇文章将为大家详细讲解有关Retrofit2.0怎么实现图文上传,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

最近项目里用到了类似图文上传的功能,以前都是封装OkHttp的文件上传功能,这次想换个姿势,想用Retrofit2.0实现这样的功能,本来以为挺简单的,没想到进入了深坑,连续调整了好几种姿势都报了同一个错,接着网上类似的文章找了一大推,讲得都是模棱两可,或者对多参数格式不够友好,最后还是去看了相关的源码,自己把这个问题提出来解决了,在这里记录一下。

一、定义网络请求接口

public interface GoodsReturnapiService {  @Multipart  @POST(Compares.GOODS_RETURN_POST)  //这里是自己post文件的地址  Observable<GoodsReturnPostEntity> postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map, @Part List<MultipartBody.Part> parts);}

上面定义了一个接口用于上传文件请求,有几个注解需要说明一下, @Multipart这是Retrofit专门用于文件上传的注解,需要配合@POST一起使用。

方法postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map, @Part List<MultipartBody.Part> parts)第一个参数使用注解@PartMap用于多参数的情况,如果是单个参数也可使用注解@Part。

在类型Map<String, RequestBody>中,Map第一个泛型String是服务器接收用于文件上传参数字段的Key,第二个泛型RequestBody是OkHttp3包装的上传参数字段的Value,这也是图文上传成功的关键所在。在后面会具体说到。

第二个参数使用注解@Part用于文件上传,多文件上传使用集合类型List<MultipartBody.Part>,单文件可以使用类型MultipartBody.Part,具体的使用同样后面讲。

这里着重说明一下,postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map, @Part List<MultipartBody.Part> parts)方法参数这样写纯属个人习惯,你也可以直接使用一个参数postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map),不过后面对RequestBody的处理方式也要跟着变化,这里就不详细说了,只会介绍上面这种简便清晰的方式。

二、初始化Retrofit

public class HttpRequestClient {  public static final String TAG = "HttpRequestClientTAG";  private static Retrofit retrofit;  private static OkHttpClient getOkHttpClient() {    //日志显示级别    HttpLoggingInterceptor.Level level= HttpLoggingInterceptor.Level.BODY;    //新建log拦截器    HttpLoggingInterceptor loggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {      @Override      public void log(String message) {        Log.d(TAG, message);      }    });    loggingInterceptor.setLevel(level);    //定制OkHttp    OkHttpClient.Builder httpClientBuilder = new OkHttpClient        .Builder();    //OkHttp进行添加拦截器loggingInterceptor    httpClientBuilder.addInterceptor(loggingInterceptor);    return httpClientBuilder.build();  }  public static Retrofit getRetrofitHttpClient(){    if(null == retrofit){      synchronized (HttpRequestClient.class){        if(null == retrofit){          retrofit = new Retrofit.Builder()              .client(getOkHttpClient())              .baseUrl(Compares.URL)              .addConverterFactory(GsonConverterFactory.create())              .addCallAdapterFactory(RxJava2CallAdapterFactory.create())              .build();        }      }    }    return retrofit;  }}

为了演示,Retrofit封装比较简陋,为的是查看网络拦截,就不详细说了。

三、发起文件上传请求

private void postGoodsPicToServer(){    Map<String,RequestBody> params = new HashMap<>();    //以下参数是伪代码,参数需要换成自己服务器支持的    params.put("type", convertToRequestBody("type"));    params.put("title",convertToRequestBody("title"));    params.put("info",convertToRequestBody("info");    params.put("count",convertToRequestBody("count"));    //为了构建数据,同样是伪代码    String path2 = Environment.getExternalStorageDirectory() + File.separator + "test1.jpg";    String path3 = Environment.getExternalStorageDirectory() + File.separator + "test1.jpg";    List<File> fileList = new ArrayList<>();    fileList.add(new File(path2));    fileList.add(new File(path3));    List<MultipartBody.Part> partList = filesToMultipartBodyParts(fileList);    HttpRequestClient.getRetrofitHttpClient().create(GoodsReturnApiService.class)        .postGoodsReturnPostEntitys(params,partList)        .subscribeOn(Schedulers.newThread())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Observer<GoodsReturnPostEntity>() {          @Override          public void onSubscribe(@NonNull Disposable d) {          }          @Override          public void onNext(@NonNull GoodsReturnPostEntity goodsReturnPostEntity) {          }          @Override          public void onError(@NonNull Throwable e) {          }          @Override          public void onComplete() {          }        });}

上面的params和fileList都是构造的伪代码,需要根据自己项目的业务需求改变。

下面是上传文件成功第一个关键,对参数请求头(姑且叫这个名字,对应Retrofit上传文件时参数那部分请求头,下文件(图片)请求头同理,对应文件那部分请求头)的content-type赋值,使用convertToRequestBody()方法。

private RequestBody convertToRequestBody(String param){    RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), param);    return requestBody;  }

因为GsonConverterFactory.create()转换器的缘故,会将参数请求头的content-type值默认赋值application/JSON,如果没有进行这步转换操作,就可以在OKHttp3的日志拦截器中查看到这样的赋值,这样导致服务器不能正确识别参数,导致上传失败,所以这里需要对参数请求头的content-type设置一个正确的值:text/plain。

下面是上传文件成功第二个关键的地方,将文件(图片)请求头的content-type使用方法filesToMultipartBodyParts()对其赋值"image/png",并返回MultipartBody.Part集合。

private List<MultipartBody.Part> filesToMultipartBodyParts(List<File> files) {    List<MultipartBody.Part> parts = new ArrayList<>(files.size());    for (File file : files) {      RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);      MultipartBody.Part part = MultipartBody.Part.createFORMData("multipartFiles", file.getName(), requestBody);      parts.add(part);    }    return parts;  }

关于“Retrofit2.0怎么实现图文上传”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Retrofit2.0怎么实现图文上传

本文链接: https://www.lsjlt.com/news/221834.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Retrofit2.0怎么实现图文上传
    这篇文章将为大家详细讲解有关Retrofit2.0怎么实现图文上传,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近项目里用到了类似图文上传的功能,以前都是封装OkHttp的文件上传功能,这次想换个姿势,...
    99+
    2023-05-30
    retrofit
  • Springboot怎么实现图片上传
    1.首先图片上传,需要在数据库定义一个varchar类型的img字段图片字段  2.需要在pom文件加图片上传的配置文件   commons-io commons...
    99+
    2023-10-19
    mysql spring boot
  • php怎么实现多图上传
    本文操作环境:Windows7系统、thinkphp v5.1版、DELL G3电脑php怎么实现多图上传?php实现多图上传的方法:先上一张图片给大家看看效果,有需要就下载学习。不一定非要在ThinkPHP里,只是我目前是去学习使用Thi...
    99+
    2022-03-09
    php
  • php怎么实现上传图片
    PHP是一种广泛用于Web开发的服务器端脚本语言,可以实现很多Web功能。其中,上传图片是Web开发中常见的一项任务,本文将介绍PHP中的上传图片方法。一、基本概念在介绍上传图片方法之前,我们需要了解一些基本概念:$_FILES$_FILE...
    99+
    2023-05-14
  • Java实现图片文件上传
    Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口。 接口部分(interface) 将接口分为单图片上传以及多图片上传 public interface FileUp...
    99+
    2022-11-13
  • 怎么用php实现图片上传
    这篇文章主要介绍了怎么用php实现图片上传的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用php实现图片上传文章都会有所收获,下面我们一起来看看吧。一、创建html页面首先,我们要创建一个html页面,这个...
    99+
    2023-07-05
  • java怎么实现文件上传
    (1)准备好前台页面Upload.html表单 action=上传文件后台接口 method=“post”enctype=“multipart/form-data”文件输入框 (2)加入相应的jar包免费在线视频教程分...
    99+
    2017-05-26
    java 实现 文件上传
  • layui怎么实现文件上传
    这篇文章将为大家详细讲解有关layui怎么实现文件上传,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<!DOCTYPE html> &l...
    99+
    2022-10-19
  • react怎么实现文件上传
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react怎么实现文件上传?react使用antd实现手动上传文件(提交表单)前言:最近在做一个后台管理项目涉及到上传文件,使用antd里的Upload实...
    99+
    2023-05-14
    React
  • 怎么利用HTML5实现图片文件异步上传
    本篇内容介绍了“怎么利用HTML5实现图片文件异步上传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • Android Retrofit实现多图片/文件、图文上传功能
    什么是 Retrofit ? Retrofit是Square开发的一个Android和Java的REST客户端库。这个库非常简单并且具有很多特性,相比其他的网络库,更...
    99+
    2022-06-06
    图片 retrofit Android
  • ajax怎么实现异步文件或图片上传功能
    这篇文章主要介绍ajax怎么实现异步文件或图片上传功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!大家好,这篇文章我要给大家分享一个网页文件上传功能的代码,希望大家可以有所参考,或者给我提些建议。众所周知现在的各大...
    99+
    2023-06-08
  • html5怎么实现图片上传预览
    这篇文章主要介绍“html5怎么实现图片上传预览”,在日常操作中,相信很多人在html5怎么实现图片上传预览问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5怎么实现图...
    99+
    2022-10-19
  • Flask接收上传图片怎么实现
    本篇内容介绍了“Flask接收上传图片怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!思路整理:接收图片->定义一个图片存放的位...
    99+
    2023-07-02
  • Ajax怎么实现上传图像功能
    这篇“Ajax怎么实现上传图像功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Ajax怎么实现上传图像功能”文章吧。最终效...
    99+
    2023-06-29
  • PHP怎么实现上传图片功能
    本篇内容主要讲解“PHP怎么实现上传图片功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP怎么实现上传图片功能”吧!首先我们在form表单加上上传附件#file,上传按钮#imgbut,记...
    99+
    2023-06-04
  • vue如何实现上传图片文件
    这篇文章给大家分享的是有关vue如何实现上传图片文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。原始input标签form表单上传<input type="file"&nbs...
    99+
    2023-06-15
  • golang大文件上传怎么实现
    在Go语言中,可以使用`net/http`包来实现大文件上传。下面是一个简单的示例: package main import ( ...
    99+
    2023-10-26
    golang
  • C#怎么实现FTP上传文件
    本文小编为大家详细介绍“C#怎么实现FTP上传文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现FTP上传文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过用FTP进行上传文件,首先要实现建立F...
    99+
    2023-06-30
  • JavaWeb中怎么实现文件上传
    这期内容当中小编将会给大家带来有关JavaWeb中怎么实现文件上传,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。引入依赖当然在引入依赖之前我们需要先创建一个被Maven管理的Web Project,创建方...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作