您好,登錄后才能下訂單哦!
最近在做Android項目,使用的是MVP+Retrofit+rxjava+dagger的項目架構(gòu),RestFul 服務(wù)使用的.Net平臺的WebApi。由于業(yè)務(wù)中需要有多文件上傳的功能。所以在這里記載一下,便于以后查閱。
Android端Retrofit api 定義
在這次上傳中,我們將實體類數(shù)據(jù)和文件數(shù)據(jù)一起上傳到服務(wù)端。所以只寫一個api就好
() Observable<HttpResult<String>> addEvent(() Event entity, ()List<MultipartBody.Part> parts);
讀取文件并將其轉(zhuǎn)換成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(); } ; }
調(diào)用Retrofit 進(jìn)行網(wǎng)絡(luò)請求,并將實體類數(shù)據(jù)和文件數(shù)據(jù)一并發(fā)送到 服務(wù)端
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 端對文件以及數(shù)據(jù)進(jìn)行接收。由上面轉(zhuǎn)化MultipartBody 那一個環(huán)節(jié)我們可以看到,傳到服務(wù)端的數(shù)據(jù)是以HTTP形式傳送的。數(shù)據(jù)類型都是multipart/form-data類型的。所以我們在服務(wù)端要使用http相關(guān)協(xié)議來進(jìn)行接收。
[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)))//如果不存在就創(chuàng)建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; }
這里有幾點需要注意,實體類的數(shù)據(jù),傳輸?shù)椒?wù)端的時候,會以JSON字符串的形式傳輸?shù)胶笈_。這樣的話,在后臺使用的時候,需要對其進(jìn)行反序列化。
另外,上傳的文件,在HTTP中是以集合的形式存在,直接取出來,存儲到本地就好。有一點需要注意的是,由于IIS對上傳文件的限制,需要提前修改一下允許上傳文件的上限。要不然,會上傳不成功(這些都是已經(jīng)踩過的坑)。
說在最后,其實上傳文件很簡單,網(wǎng)上有很多的大神已經(jīng)講解的非常詳細(xì)。之所又自己啰嗦了一下,是因為,在做的過程中,踩了很多的坑,而且網(wǎng)上大多數(shù)人都只寫了Android端,沒有寫服務(wù)端。再加上,.NET WebApi 用的人比較小眾,所以就記錄了一下。以后有時間會補上Spring 作為服務(wù)端的寫法。以及Struts作為服務(wù)端的寫法。
今天就到這里吧。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。