博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
阅读量:6115 次
发布时间:2019-06-21

本文共 3222 字,大约阅读时间需要 10 分钟。

最近在做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
,如需转载请自行联系原作者
你可能感兴趣的文章
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
easyui datagrid 行编辑功能
查看>>
类,对象与实例变量
查看>>
HDU 2818 (矢量并查集)
查看>>
【转】php字符串加密解密
查看>>
22. linux 常用命令
查看>>