Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
最近在做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) 上传多张图片相关推荐
- php104.tmp,ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
这是修改之前的代码 if(!empty($_FILES)){ if(!empty($_FILES[org_positive])){ $org_positive = request()->file ...
- yii2.0使用ueditior完成上传单张,多张图片,上传视频等操作
一.前言 由于工作需求需要集成富文本编辑器,本来是想要选用之前用过的WangEditor的,但是考虑到WangEditor还是比较小众,所以最终选择了没用过的Uedtor,这篇文章主要讲述了Yii2. ...
- Xcode7.0.1:升级Xcode7上传AppStore失败问题
1.升级Xcode7.0.1后,上传应用至AppStore,出现错误,提示如下: 提示该bundle id 存在非法字符,但该bundle id已经成功上传了几个版本,都是没问题的,就是在用Xcode ...
- 学习日志day41(2021-09-03)(1、文件的上传 2、文件的查看 3、文件的下载 4、使用工具类上传文件 5、基于servlet3.0以上的文件上传 )
学习内容:学习JavaWeb(Day41) 1.文件的上传 2.文件的查看 3.文件的下载 4.使用工具类上传文件 5.基于servlet3.0以上的文件上传 1.文件的上传 (1)实现文件的上传需要 ...
- 高手教你PHP上传多张图片
高手教你PHP上传多张图片 对于我们来说上传一张图片是非常简单的事情,这里教大家一个关于PHP上传多张图片的代码分析,希望对大家有帮助. 学习PHP时,你可能会遇到PHP上传多张图片问题,这里将介绍P ...
- php上传多张图片为什么只显示一张,javascript,_js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次???,javascript - phpStudy...
js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次??? js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次??? self.$els.upload ...
- iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样
// 上传多张图片 - (void)send {// 设置初始记录量为0self.count = 0;self.upcount = 0;// 设置初始值为NOself.isUploadPictures ...
- thinkphp3.2+cropper上传多张图片剪切图片
实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...
- php用jquery-ajax上传多张图片限制图片大小
php用jquery-ajax上传多张图片限制图片大小 /*** 上传图片,默认大小限制为3M* @param String $fileInputName* @param number $size*/ ...
最新文章
- P7520-[省选联考 2021 A 卷]支配
- CodeForces - 500A-New Year Transportation(模拟)
- java提交按钮_java – 允许“Enter”键按提交按钮,而不是仅使用MouseClick
- element 时间选择器——年
- jquery 如何获取动态添加的元素
- 友盟iOS微信登陆没有回调的原因
- log4j2配置日志默认最大个数,以及自动删除过期日志文件的配置
- ubuntu终端快速清空回收站
- vbox安装深度linux,win10系统上用VirtualBox虚拟机安装国产深度deepin系统教程
- Python数据分析基础之CSV文件(5)
- 读《大数据时代:生活,工作与思维的大变革》
- Hyper-V安裝筆記
- Java XLS 转 XLSX
- 《开天辟地》之《网上冲浪篇》将带你进入一个精彩的互联网世界
- 电路仿真软件详谈(28),如何在印刷电路板中应用proteus电路仿真软件
- 【爬虫篇】《极客Python之效率革命》(小甲鱼) b站笔记
- distinct去重用法(简单明了)
- 【原创】EXCEL筛选后数据求平均值
- OpenCV 中cv2.threshold详解,(大白话版)
- 3dmark android 中文,貌似不靠谱,Android平台3DMark测试版初体验