开发者社区> 技术小胖子> 正文

Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片

简介:
+关注继续查看

最近在做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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿。而这之前,程序之间通信效率的王者也许可以算得上是gRPC了。那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着比拼一下minimal api服务和gRPC服务在通信上的效率。
110 0
十二、.net core(.NET 6)添加通用的访问webapi的方法(包括HttpClient和HttpWebRequest)
开发通用的访问webapi方法。在common工具文件夹下,新建一个类库项目:Wsk.Core.WebHelper,并引用Package包项目,然后新建一个类HttpClientHelper,用于使用HttpClient方法进行访问webapi:
118 0
四:net core(.NET 6)使用Filter过滤器拦截webapi方法
Filter的基本用法 :代码在最下方使用filter过滤器,来实现拦截接口信息。咱们先新建一个项目,在原有的webapi上面,选择添加项目,添加一个类库项目
136 0
.NET 图片解密为BASE64
#region 图片加密          ///           /// 加密本地文件          ///           /// 读取文件的路径          /// 要输出的文件路径          /// 密钥          ///           ...
817 0
C# .NET 根据Url链接保存Image图片到本地磁盘
原文:C# .NET 根据Url链接保存Image图片到本地磁盘 根据一个Image的Url链接可以在浏览器中显示一个图片,如果要通过代码将图片保存在本地磁盘可以通过以下方式: 1、首先获取图片的二进制数组。
2164 0
.net 图片无损压缩
命名空间: using System.Drawing.Imaging; using System.Drawing; using System.Drawing.Drawing2D; #region GetPicThumbnail /// /// 无损压缩图片 ...
1400 0
+关注
技术小胖子
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载