你的位置:首页 > ASP.net教程

[ASP.net教程]ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析


该示例中实际上应用了 jquery ajax(web client) + async web api 双异步。

jquery ajax post

 1 $.ajax({ 2   type: "POST", 3   url: "/api/FileUpload", 4   contentType: false, 5   processData: false, 6   data: data, 7   success: function (results) { 8     ShowUploadControls(); 9     $("#uploadResults").empty();10     for (i = 0; i < results.length; i++) {11       $("#uploadResults").append($("<li/>").text(results[i]));12     }13   },14   error: function (xhr, ajaxOptions, thrownError) {15     ShowUploadControls();16     alert(xhr.responseText);17   }18 });

client端以post的方式发送数据。其中上传成功后的回调脚本定义在success处。

 

async Web API

Controller处Action返回值为Task<TResult>,本例中如下定义:

1 public Task<IEnumerable<string>> Post()2 {3    ... ...    4 }

而具体异步效果体现在“文件内容读取”和“后续处理”上。

 1 string fullPath = HttpContext.Current.Server.MapPath("~/Uploads"); 2 CustomMultipartFormDataStreamProvider streamProvider = new CustomMultipartFormDataStreamProvider(fullPath); 3 var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => 4 { 5   if (t.IsFaulted || t.IsCanceled) 6     throw new HttpResponseException(HttpStatusCode.InternalServerError); 7  8   var fileInfo = streamProvider.FileData.Select(i => 9   {10     var info = new FileInfo(i.LocalFileName);11     return "File saved as " + info.FullName + " (" + info.Length + ")";12   });13   return fileInfo;14 15 });

ReadAsMultipartAsync

(From MSDN) 读取 MIME 多部分消息中的所有正文部分,并通过使用 streamProvider 实例确定每个正文部分内容的写入位置,来生成一组 HttpContent 实例作为结果。

 


Task.ContinueWith<TResult>

创建一个在目标 Task 完成时异步执行的延续任务。具体到该示例中,当 ReadAsMultipartAsync(读取)任务完成后,ContinueWith 中定义的行为才会作为延续而异步执行。

 

MultipartFormDataStreamProvider 对象

一个 IMultipartStreamProvider,适合与 HTML 文件上载一起使用,以将文件内容写入 FileStream。流提供程序将查看 <b>Content-Disposition</b> 标头字段,并根据 <b>filename</b> 参数是否存在来确定输出 Stream。如果 <b>Content-Disposition</b> 标头字段中存在 <b>filename</b> 参数,则正文部分将写入 FileStream 中;否则,正文部分将写入 MemoryStream 中。这将更加便于处理作为窗体数据和文件内容的组合的 MIME 多部分 HTML 窗体数据。

 

小技巧:lambda 表达式反转,从FileData到IEnumerable<string>

1 var fileInfo = streamProvider.FileData.Select(i =>2 {3   var info = new FileInfo(i.LocalFileName);4   return "File saved as " + info.FullName + " (" + info.Length + ")";5 });

 

示例代码

 




山东旅游线路报价山东旅游指南攻略大全山东旅游住哪里比较方便山东旅游住宿攻略山东旅游最佳时间2015清明节深圳哪里有活动?深圳清明节去哪好玩? 盘点重庆15处放风筝胜地 让好心情与风筝齐飞 2015清明节深圳地王观光门票多少钱?地王大厦观光清明节票价? 德庆盘龙峡酒店住宿多少钱?盘龙峡住宿价格? 2015春节广州哪里有花展?广州春节花展在什么地方举办? 2015春节宝趣玫瑰园花展时间?从化宝趣玫瑰世界春节花展有什么花? 2015春节宝趣玫瑰园花展时间?从化宝趣玫瑰世界春节花展怎么样? 2015春节宝趣玫瑰园有什么活动?宝趣玫瑰园春节看花怎么样? 万圣节来袭 开启“鬼”混之旅 人文泸西 不一样的城子古村 798艺术区怎么去? 大庆人烧钱爱好:唱歌(组图) 澳门环岛游现在的票价是多少钱?可以玩多久? 在香港购物可以直接刷普通的借记卡吗? 去香港买什么便宜? 从香港去澳门在哪个码头坐船啊? SQCAEA150FAJME Datasheet SQCAEA150FAJME Datasheet 08055U131FAT9A Datasheet 08055U131FAT9A Datasheet AQ12EA6R8KAJME Datasheet AQ12EA6R8KAJME Datasheet 齐齐哈尔去香港游 齐齐哈尔去香港游 齐齐哈尔去香港游 大兴安岭出发去香港旅游 大兴安岭出发去香港旅游 大兴安岭出发去香港旅游 牡丹江跟团去香港 牡丹江跟团去香港 牡丹江跟团去香港