ASP.NET WebApi框架异步实现MultipartContent方式上传文件
ASP.NET WebApi框架异步实现MultipartContent方式上传文件
ASP.NET WebApi框架异步实现MultipartContent方式上传文件,功能特点: 1. 接口采用异步(Async)方式。 2. 接口支持数据签名。 WebApi服务端接口设计: C# Code: /// <summary> /// 使用MultipartFormData上传文件,支持多个文件上传. /// 路由格式:http://localhost:8888/user/file/upload /// </summary> /// <returns></returns> [HttpPost] [ActionName("upload")] public async Task<ModelResponse> Upload() { //判断内容类型是否MimeMultipartContent if (!this.Request.Content.IsMimeMultipartContent()) return new ModelResponse { Code = -1, Message = "无效的媒体类型(必须为MimeMultipartContent)" }; //获取Request.Headers头部信息 string apikey = GetHeaderValue(this.Request.Headers, "apikey"); string bucket = GetHeaderValue(this.Request.Headers, "bucket"); string sign = GetHeaderValue(this.Request.Headers, "sign"); string ts = GetHeaderValue(this.Request.Headers, "ts"); //检查参数 if (String.IsNullOrEmpty(bucket) || String.IsNullOrEmpty(apikey) || String.IsNullOrEmpty(sign)) return new ModelResponse { Code = ErrorCodes.InvalidParameter, Message = ErrorCodes.InvalidParameter_Msg }; // //检查通过,执行逻辑处理。。。。 // //省略代码。。。。 } //来源:C/S框架网 | www.csframework.com | QQ:23404761 客户端测试接口: C# Code: /// <summary> /// 上传文件 /// URL格式:http://localhost:19893/user/file/upload /// </summary> /// <param name="bucket">文件根目录名</param> /// <param name="fileList">文件清单</param> /// <param name="headers">提交的Request.Headers数据</param> /// <returns></returns> public ModelResponse Upload(string bucket, List<string> fileList, NameValueCollection headers) { if (headers == null) headers = new NameValueCollection(); string ts = DateTime.Now.ToString("yyyyMMddHHmmss"); //传公钥及数据签名 headers.Add("apikey", _apikey); headers.Add("bucket", bucket); headers.Add("ts", ts); headers.Add("sign", CryptoHelper.ToMD5(_apikey + bucket + _secretKey + ts)); using (HttpClient client = new HttpClient()) { client.Timeout = new TimeSpan(0, 10, 0);//10分钟 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/json"));//响应数据格式 //multipart/form-data的方式上传数据 using (var content = new MultipartFormDataContent()) { AddToHeader(content, headers);//添加FormData AddToContent(content, this.GetFileByteArrayContent(fileList));//添加文件数据 try { HttpResponseMessage result = client.PostAsync(_urlBase, content).Result;//post请求 if (result.IsSuccessStatusCode) { string json = result.Content.ReadAsStringAsync().Result;//将响应结果显示在文本框内 return JsonConvert.DeserializeObject<ModelResponse>(json); } else { return new ModelResponse { Code = -1, Message = result.Content.ReadAsStringAsync().Result }; } } catch (Exception ex) { return new ModelResponse { Code = -1, Message = ex.ToString() }; } } } } //来源:C/S框架网 | www.csframework.com | QQ:23404761 C# Code: /// <summary> /// 添加头部信息 /// </summary> /// <param name="content"></param> /// <param name="headers"></param> private void AddToHeader(MultipartFormDataContent content, NameValueCollection headers) { foreach (string item in headers.Keys) { content.Headers.Add(item, headers[item]); } } C# Code: /// <summary> /// 添加内容 /// </summary> /// <param name="content"></param> /// <param name="dataContents"></param> private void AddToContent(MultipartFormDataContent content, List<ByteArrayContent> dataContents) { foreach (var byteArrayContent in dataContents) { content.Add(byteArrayContent); } } C# Code: /// <summary> /// 获取文件集合对应的ByteArrayContent集合 /// </summary> /// <param name="files">文件清单</param> /// <returns></returns> private List<ByteArrayContent> GetFileByteArrayContent(List<string> files) { List<ByteArrayContent> list = new List<ByteArrayContent>(); foreach (var file in files) { var fileContent = new ByteArrayContent(File.ReadAllBytes(file)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = Path.GetFileName(file) }; list.Add(fileContent); } return list; } C# Code: /// <summary> /// 获取键值集合对应的ByteArrayContent集合 /// </summary> /// <param name="collection"></param> /// <returns></returns> private List<ByteArrayContent> GetFormDataByteArrayContent(NameValueCollection collection) { List<ByteArrayContent> list = new List<ByteArrayContent>(); foreach (var key in collection.AllKeys) { var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(collection[key])); dataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { Name = key }; list.Add(dataContent); } return list; } //来源:C/S框架网 | www.csframework.com | QQ:23404761 ASP.NET WebApi快速开发框架|APP后端框架-标准版V1.0 适用开发:快速搭建APP、B/S、C/S、微信小程序、公众号、Web站点等后端应用服务程序。 运行平台:Windows + .NET Framework 4.5 开发工具:Visual Studio 2015+,C#语言 数据库:Microsoft SQLServer 2008R2+(支持多数据库:Oracle/MySql) CSFramework.WebAPI产品详情:http://www.csframework.com/cs-framework-webapi-1.0.htm 扫一扫加微信
参考文档:
Asp.Net FileUpload类实现上传文件(C/S框架网开源) 原创WebApi框架:采用HTTPS协议SelfHosting,Windows服务承载WebApi服务 Asp.Net开源服务端框架,WebApi后端框架标准版 CSFramework.WebApi框架实现阿里云OSS上传、下载、删除文件功能 WebApi快速开发框架,C# ASP.NET后端开发平台 微信小程序后端框架 | C# ASP.NET服务端WebApi快速开发框架平台 CSFramework.WebApi框架快速搭建后端服务支持APP、B/S、C/S、微信小程序、公众号、Web客户端 WebApi框架:未能找到类型或命名空间名HttpActionContext(是否缺少using指令或程序集引用?) WebApi框架:命名空间"System.Web"中不存在类型或命令空间名"Http"(是否缺少程序集引用?) CSFramework.WebApi时钟定时作业异步处理程序(IThreadHandler接口)实现 关于CSFramework.WebApi框架NuGet程序包版本升级版本统一问题 WebApi框架CmdLogin.Login方法返回的数据是加密的 WebApi框架:编译提示缺少Microsoft.Owin.Extensions引用 使用WebApi框架开发微信小程序后端程序详细设计说明书模板docx文件 WebApi框架数据安全、信息安全与接口安全六大机制
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |