最近在做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作为服务端的写法。
今天就到这里吧。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。