Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片

简介:

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

  • Android端Retrofit api 定义

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 进行网络请求,并将实体类数据和文件数据一并发送到 服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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相关协议来进行接收。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
                [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作为服务端的写法。


  • 今天就到这里吧。



     本文转自Eumenides_s 51CTO博客,原文链接:http://blog.51cto.com/xiaoshuaigege/1878634 ,如需转载请自行联系原作者

相关文章
|
3月前
|
数据安全/隐私保护
.net给图片增加水印和生成图片缩略图
.net给图片增加水印和生成图片缩略图
33 0
|
3月前
|
域名解析 缓存 Linux
如何让你的.NET WebAPI程序支持HTTP3?
如何让你的.NET WebAPI程序支持HTTP3?
47 2
如何让你的.NET WebAPI程序支持HTTP3?
|
6月前
|
C#
C# .net webapi使用swagger时显示controller注释
C# .net webapi使用swagger时显示controller注释
86 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
123 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
116 0