最近在做Android项目,使用的是MVP+Retrofit+rxjava+dagger的项目架构,RestFul 服务使用的.Net平台的WebApi。由于业务中需要有多文件上传的功能。所以在这里记载一下,便于以后查阅。

  • Android端Retrofit api 定义

    在这次上传中,我们将实体类数据和文件数据一起上传到服务端。所以只写一个api就好

()
Observable<HttpResult<String>> addEvent(() Event entity, ()List<MultipartBody.Part> parts);
  • 读取文件并将其转换成MuiltipartBody.Part 列表

List<MultipartBody.Part> getFilesMap() {= ArrayList<MultipartBody.Part>();File file = ;{(!= && .size() > ) {(String path : ) {file = File(path);RequestBody requestBody = RequestBody.(MediaType.(), file);MultipartBody.Part part = MultipartBody.Part.(, file.getName(), requestBody);.add(part);}}} (Exception e) {e.printStackTrace();};
}
  • 调用Retrofit 进行网络请求,并将实体类数据和文件数据一并发送到 服务端

addEvent() {Event entity = .getEntity();List<MultipartBody.Part> fileMap = .getFilesMap();.clear();{Subscription subscription = .getRetrofitInstance().create(EventInterface.).addEvent(entity, fileMap).subscribeOn(.io()).observeOn(.ui()).subscribe(Subscriber<HttpResult<String>>() {onCompleted() {}onError(Throwable e) {.setLoadingIndicator();e.printStackTrace();}onNext(HttpResult<String> httpResult) {(httpResult.getResultCode() != ConstData.HttpResult.) {.setLoadingIndicator();} {.setLoadingIndicator();}}});.add(subscription);} (Exception e) {e.printStackTrace();}}
  • 在webapi 端对文件以及数据进行接收。由上面转化MultipartBody   那一个环节我们可以看到,传到服务端的数据是以HTTP形式传送的。数据类型都是multipart/form-data类型的。所以我们在服务端要使用http相关协议来进行接收。

               [HttpPost]public HttpResult<string> AddEvent(){//获取EventET 的属性HttpRequest request = HttpContext.Current.Request;string entity = request.Form[0];BaseBN baseBN = new BaseBN();EventET et = baseBN.CTJsonSerializer<EventET>(entity);SystemBN bn = new SystemBN();et.EVENT_ID = bn.CreateID("EVENT", HaiQu.N, "EVENT_ID", "EVENT", EventType.YiYou);List<string> addr = new List<string>();//获取上传的文件HttpFileCollection coll = request.Files;for (int i = 0; i < coll.Count; i++){HttpPostedFile file = coll.Get(i);String filename = file.FileName.Substring(file.FileName.LastIndexOf("\\") + 1);if (!Directory.Exists(System.Web.HttpContext.Current.Server.MapPath("~/Upload/" + et.EVENT_ID)))//如果不存在就创建file文件夹{Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath("~/Upload/" + et.EVENT_ID));}string fileSavePath = string.Format("~/Upload/" + et.EVENT_ID + "/{0}", filename);file.SaveAs(System.Web.HttpContext.Current.Server.MapPath(fileSavePath));addr.Add(fileSavePath);}EventBN eventBN = new EventBN();HttpResult<string> result = eventBN.AddEvent(et, addr, HaiQu.N);return result;}
  • 这里有几点需要注意,实体类的数据,传输到服务端的时候,会以JSON字符串的形式传输到后台。这样的话,在后台使用的时候,需要对其进行反序列化。

  • 另外,上传的文件,在HTTP中是以集合的形式存在,直接取出来,存储到本地就好。有一点需要注意的是,由于IIS对上传文件的限制,需要提前修改一下允许上传文件的上限。要不然,会上传不成功(这些都是已经踩过的坑)。

  • 说在最后,其实上传文件很简单,网上有很多的大神已经讲解的非常详细。之所又自己啰嗦了一下,是因为,在做的过程中,踩了很多的坑,而且网上大多数人都只写了Android端,没有写服务端。再加上,.NET WebApi 用的人比较小众,所以就记录了一下。以后有时间会补上Spring 作为服务端的写法。以及Struts作为服务端的写法。

  • 今天就到这里吧。

转载于:https://blog.51cto.com/xiaoshuaigege/1878634

Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片相关推荐

  1. php104.tmp,ThinkPHP5.0多个文件上传后找不到临时文件的修改方法

    这是修改之前的代码 if(!empty($_FILES)){ if(!empty($_FILES[org_positive])){ $org_positive = request()->file ...

  2. yii2.0使用ueditior完成上传单张,多张图片,上传视频等操作

    一.前言 由于工作需求需要集成富文本编辑器,本来是想要选用之前用过的WangEditor的,但是考虑到WangEditor还是比较小众,所以最终选择了没用过的Uedtor,这篇文章主要讲述了Yii2. ...

  3. Xcode7.0.1:升级Xcode7上传AppStore失败问题

    1.升级Xcode7.0.1后,上传应用至AppStore,出现错误,提示如下: 提示该bundle id 存在非法字符,但该bundle id已经成功上传了几个版本,都是没问题的,就是在用Xcode ...

  4. 学习日志day41(2021-09-03)(1、文件的上传 2、文件的查看 3、文件的下载 4、使用工具类上传文件 5、基于servlet3.0以上的文件上传 )

    学习内容:学习JavaWeb(Day41) 1.文件的上传 2.文件的查看 3.文件的下载 4.使用工具类上传文件 5.基于servlet3.0以上的文件上传 1.文件的上传 (1)实现文件的上传需要 ...

  5. 高手教你PHP上传多张图片

    高手教你PHP上传多张图片 对于我们来说上传一张图片是非常简单的事情,这里教大家一个关于PHP上传多张图片的代码分析,希望对大家有帮助. 学习PHP时,你可能会遇到PHP上传多张图片问题,这里将介绍P ...

  6. php上传多张图片为什么只显示一张,javascript,_js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次???,javascript - phpStudy...

    js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次??? js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次??? self.$els.upload ...

  7. iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样

    // 上传多张图片 - (void)send {// 设置初始记录量为0self.count = 0;self.upcount = 0;// 设置初始值为NOself.isUploadPictures ...

  8. thinkphp3.2+cropper上传多张图片剪切图片

    实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...

  9. php用jquery-ajax上传多张图片限制图片大小

    php用jquery-ajax上传多张图片限制图片大小 /*** 上传图片,默认大小限制为3M* @param String $fileInputName* @param number $size*/ ...

最新文章

  1. P7520-[省选联考 2021 A 卷]支配
  2. CodeForces - 500A-New Year Transportation(模拟)
  3. java提交按钮_java – 允许“Enter”键按提交按钮,而不是仅使用MouseClick
  4. element 时间选择器——年
  5. jquery 如何获取动态添加的元素
  6. 友盟iOS微信登陆没有回调的原因
  7. log4j2配置日志默认最大个数,以及自动删除过期日志文件的配置
  8. ubuntu终端快速清空回收站
  9. vbox安装深度linux,win10系统上用VirtualBox虚拟机安装国产深度deepin系统教程
  10. Python数据分析基础之CSV文件(5)
  11. 读《大数据时代:生活,工作与思维的大变革》
  12. Hyper-V安裝筆記
  13. Java XLS 转 XLSX
  14. 《开天辟地》之《网上冲浪篇》将带你进入一个精彩的互联网世界
  15. 电路仿真软件详谈(28),如何在印刷电路板中应用proteus电路仿真软件
  16. 【爬虫篇】《极客Python之效率革命》(小甲鱼) b站笔记
  17. distinct去重用法(简单明了)
  18. 【原创】EXCEL筛选后数据求平均值
  19. OpenCV 中cv2.threshold详解,(大白话版)
  20. 3dmark android 中文,貌似不靠谱,Android平台3DMark测试版初体验

热门文章

  1. 第四节:python if语句用法
  2. ADO.net数据访问
  3. JDBC常见面试题集锦(二)
  4. linux sftp命令连接数,linux记录sftp命令
  5. python中换行的转义符_详解Python中的各种转义符\n\r\t
  6. 02.Python基础
  7. 柱状折线图2-双柱状重合堆积折线-重写图例点击事件
  8. jQuery .attr(checked)得undefined 问题解决
  9. 学习笔记-nil NULL NSNull Nil的区别
  10. 转-android图片降低图片大小保持图片清晰的方法