Retrofit2.0+.NetMVC4(WebApi)上传多张图片-创新互联

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

创新互联建站是一家集网站建设,昌图企业网站建设,昌图品牌网站建设,网站定制,昌图网站建设报价,网络营销,网络优化,昌图网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
  • Android端Retrofit api 定义

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

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

List getFilesMap() {

    = ArrayList();
    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 fileMap = .getFilesMap();
    .clear();

    {
        Subscription subscription = .getRetrofitInstance()
                .create(EventInterface.)
                .addEvent(entity, fileMap)
                .subscribeOn(.io()).observeOn(.ui()).subscribe(Subscriber>() {
                    onCompleted() {

                    }

                    onError(Throwable e) {
                        .setLoadingIndicator();

                        e.printStackTrace();

                    }

                    onNext(HttpResult httpResult) {
                        (httpResult.getResultCode() != ConstData.HttpResult.) {
                            .setLoadingIndicator();
                        } {
                            .setLoadingIndicator();
                        }


                    }
                });
        .add(subscription);
    } (Exception e) {
        e.printStackTrace();
    }

}
  • 在webapi 端对文件以及数据进行接收。由上面转化MultipartBody   那一个环节我们可以看到,传到服务端的数据是以HTTP形式传送的。数据类型都是multipart/form-data类型的。所以我们在服务端要使用http相关协议来进行接收。

               [HttpPost]
        public HttpResult AddEvent()
        {
            //获取EventET 的属性
            HttpRequest request = HttpContext.Current.Request;
            string entity = request.Form[0];
            BaseBN baseBN = new BaseBN();
            EventET et = baseBN.CTJsonSerializer(entity);
            SystemBN bn = new SystemBN();
            et.EVENT_ID = bn.CreateID("EVENT", HaiQu.N, "EVENT_ID", "EVENT", EventType.YiYou);
            List addr = new List();
            //获取上传的文件
            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 result = eventBN.AddEvent(et, addr, HaiQu.N);
            return result;
          
        }

  • 这里有几点需要注意,实体类的数据,传输到服务端的时候,会以JSON字符串的形式传输到后台。这样的话,在后台使用的时候,需要对其进行反序列化。

  • 另外,上传的文件,在HTTP中是以集合的形式存在,直接取出来,存储到本地就好。有一点需要注意的是,由于IIS对上传文件的限制,需要提前修改一下允许上传文件的上限。要不然,会上传不成功(这些都是已经踩过的坑)。

  • 说在最后,其实上传文件很简单,网上有很多的大神已经讲解的非常详细。之所又自己啰嗦了一下,是因为,在做的过程中,踩了很多的坑,而且网上大多数人都只写了Android端,没有写服务端。再加上,.NET WebApi 用的人比较小众,所以就记录了一下。以后有时间会补上Spring 作为服务端的写法。以及Struts作为服务端的写法。

  • 今天就到这里吧。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享标题:Retrofit2.0+.NetMVC4(WebApi)上传多张图片-创新互联
标题链接:http://azwzsj.com/article/cepsei.html