溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Retrofit2.0+ .Net MVC4(WebApi) 上傳多張圖片

發(fā)布時間:2020-06-19 17:37:21 來源:網(wǎng)絡(luò) 閱讀:1435 作者:Eumenides_s 欄目:編程語言

最近在做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ù)端的寫法。


  • 今天就到這里吧。

向AI問一下細(xì)節(jié)

免責(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)容。

AI