Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
最近在做Android项目,使用的是MVP+Retrofit+rxjava+dagger的项目架构,RestFul 服务使用的.Net平台的WebApi。由于业务中需要有多文件上传的功能。所以在这里记载一下,便于以后查阅。
Android端Retrofit api 定义
在这次上传中,我们将实体类数据和文件数据一起上传到服务端。所以只写一个api就好
()Observable<HttpResult<String>>addEvent(()Evententity,()List<MultipartBody.Part>parts);
读取文件并将其转换成MuiltipartBody.Part 列表
List<MultipartBody.Part>getFilesMap(){=ArrayList<MultipartBody.Part>();Filefile=;{(!=&&.size()>){(Stringpath:){file=File(path);RequestBodyrequestBody=RequestBody.(MediaType.(),file);MultipartBody.Partpart=MultipartBody.Part.(,file.getName(),requestBody);.add(part);}}}(Exceptione){e.printStackTrace();};}
调用Retrofit 进行网络请求,并将实体类数据和文件数据一并发送到 服务端
addEvent(){Evententity=.getEntity();List<MultipartBody.Part>fileMap=.getFilesMap();.clear();{Subscriptionsubscription=.getRetrofitInstance().create(EventInterface.).addEvent(entity,fileMap).subscribeOn(.io()).observeOn(.ui()).subscribe(Subscriber<HttpResult<String>>(){onCompleted(){}onError(Throwablee){.setLoadingIndicator();e.printStackTrace();}onNext(HttpResult<String>httpResult){(httpResult.getResultCode()!=ConstData.HttpResult.){.setLoadingIndicator();}{.setLoadingIndicator();}}});.add(subscription);}(Exceptione){e.printStackTrace();}}
在webapi 端对文件以及数据进行接收。由上面转化MultipartBody 那一个环节我们可以看到,传到服务端的数据是以HTTP形式传送的。数据类型都是multipart/form-data类型的。所以我们在服务端要使用http相关协议来进行接收。
[HttpPost]publicHttpResult<string>AddEvent(){//获取EventET的属性HttpRequestrequest=HttpContext.Current.Request;stringentity=request.Form[0];BaseBNbaseBN=newBaseBN();EventETet=baseBN.CTJsonSerializer<EventET>(entity);SystemBNbn=newSystemBN();et.EVENT_ID=bn.CreateID("EVENT",HaiQu.N,"EVENT_ID","EVENT",EventType.YiYou);List<string>addr=newList<string>();//获取上传的文件HttpFileCollectioncoll=request.Files;for(inti=0;i<coll.Count;i++){HttpPostedFilefile=coll.Get(i);Stringfilename=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));}stringfileSavePath=string.Format("~/Upload/"+et.EVENT_ID+"/{0}",filename);file.SaveAs(System.Web.HttpContext.Current.Server.MapPath(fileSavePath));addr.Add(fileSavePath);}EventBNeventBN=newEventBN();HttpResult<string>result=eventBN.AddEvent(et,addr,HaiQu.N);returnresult;}
这里有几点需要注意,实体类的数据,传输到服务端的时候,会以JSON字符串的形式传输到后台。这样的话,在后台使用的时候,需要对其进行反序列化。
另外,上传的文件,在HTTP中是以集合的形式存在,直接取出来,存储到本地就好。有一点需要注意的是,由于IIS对上传文件的限制,需要提前修改一下允许上传文件的上限。要不然,会上传不成功(这些都是已经踩过的坑)。
说在最后,其实上传文件很简单,网上有很多的大神已经讲解的非常详细。之所又自己啰嗦了一下,是因为,在做的过程中,踩了很多的坑,而且网上大多数人都只写了Android端,没有写服务端。再加上,.NET WebApi 用的人比较小众,所以就记录了一下。以后有时间会补上Spring 作为服务端的写法。以及Struts作为服务端的写法。
今天就到这里吧。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。