使用Ajax生成的Excel文件并下載的實(shí)例
很久沒有寫文章啦,今天分享一個(gè)如何在ASP.NET MVC里使用Ajax下載生成文件的方法,以下只是個(gè)人心得:
大家都應(yīng)該知道,在ASP.NET MVC里,如果通過Ajax調(diào)用后臺(tái)控制器時(shí),可以返回一個(gè)JSON對(duì)象,但并不能直接返回文件(除非刷新頁(yè)面,那就不是Ajax啦),所以如果想用Ajax生成文件并下載的話,那只要將生成的文件先保存到服務(wù)器上,然後再將文件路徑通過JSON返回,之後才可以進(jìn)行下載,當(dāng)然由於是暫時(shí)性存放,所以當(dāng)下載完后就需要馬上刪除相應(yīng)的文件。
以下是做法以動(dòng)態(tài)生成Excel為例(生成Excel的具體步驟我就省略了,這并不是此文章的重點(diǎn)):
1. 首先創(chuàng)建Action生成Excel文件
[HttpPost] public JsonResult ExportExcel() { DataTable dt = DataService.GetData(); var fileName = "Excel_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls"; //將生成的文件保存到服務(wù)器的臨時(shí)目錄里 string fullPath = Path.Combine(Server.MapPath("~/temp"), fileName); using (var exportData = new MemoryStream()) { //如何生成Excel這里就不詳細(xì)說明啦,我這里對(duì)Excel的操作使用的是 NPOI Utility.WriteDataTableToExcel(dt, ".xls", exportData); FileStream file = new FileStream(fullPath, FileMode.Create, FileAccess.Write); exportData.WriteTo(file); file.Close(); } var errorMessage = "you can return the errors in here!"; //返回生成的文件名 return Json(new { fileName = fileName, errorMessage = "" }); }
2. 創(chuàng)建下載用的 Action
[HttpGet] [DeleteFileAttribute] //Action Filter, 下載完后自動(dòng)刪除文件,這個(gè)屬性稍後解釋 public ActionResult Download(string file) { //到服務(wù)器臨時(shí)文件目錄下載相應(yīng)的文件 string fullPath = Path.Combine(Server.MapPath("~/temp"), file); //返回文件對(duì)象,這里用的是Excel,所以文件頭使用了 "application/vnd.ms-excel" return File(fullPath, "application/vnd.ms-excel", file); }
3. 由於要做到下載完后自動(dòng)刪除文件,所以再創(chuàng)建一個(gè) Action Filter
public class DeleteFileAttribute : ActionFilterAttribute { public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Flush(); //將當(dāng)前filter context轉(zhuǎn)換成具體操作的文件并獲取文件路徑 string filePath = (filterContext.Result as FilePathResult).FileName; //有文件路徑后就可以直接刪除相關(guān)文件了 System.IO.File.Delete(filePath); } }
4. 最后在前臺(tái)添加 Ajax 調(diào)用的代碼:
//這里我使用了 blockUI 做loading... $.blockUI({ message: '<h3>Please wait a moment...</h3>' }); $.ajax({ type: "POST", url: '@Url.Action("ExportExcel","YourController")', //調(diào)用相應(yīng)的controller/action contentType: "application/json; charset=utf-8", dataType: "json", }).done(function (data) { //console.log(data.result); $.unblockUI(); //接收返回的文件路徑,此文件這時(shí)已保存到服務(wù)器上了 if (data.fileName != "") { //通過調(diào)用 window.location.href 直接跳轉(zhuǎn)到下載 action 進(jìn)行文件下載操作 window.location.href = "@Url.RouteUrl(new { Controller = "YourController", Action = "Download"})/?file=" + data.fileName; } });
5. 完!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ajax post下載flask文件流以及中文文件名問題
- javascript寫一個(gè)ajax自動(dòng)攔截并下載數(shù)據(jù)代碼實(shí)例
- SpringMVC+Ajax實(shí)現(xiàn)文件批量上傳和下載功能實(shí)例代碼
- Ajax請(qǐng)求二進(jìn)制流進(jìn)行處理(ajax異步下載文件)的簡(jiǎn)單方法
- 利用 FormData 對(duì)象和 Spring MVC 配合實(shí)現(xiàn)Ajax文件下載功能
- 基于Blod的ajax進(jìn)度條下載實(shí)現(xiàn)示例代碼
- PHP中ajax無刷新上傳圖片與圖片下載功能
- jQuery的ajax下載blob文件
- jQuery+Ajax+PHP彈出層異步登錄效果(附源碼下載)
- PHP+Ajax實(shí)現(xiàn)無刷新分頁(yè)實(shí)例詳解(附demo源碼下載)
- 前端ajax請(qǐng)求+后端java實(shí)現(xiàn)的下載zip壓縮包功能示例
相關(guān)文章
原生js+canvas實(shí)現(xiàn)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了原生js+canvas實(shí)現(xiàn)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11JS根據(jù)年月獲得當(dāng)月天數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了JS根據(jù)年月獲得當(dāng)月天數(shù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-07-07Javascript中Object和Map之間的轉(zhuǎn)換方法
在許多編程語言中,Object和Map都是用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于Javascript中Object和Map之間的轉(zhuǎn)換方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06js數(shù)組循環(huán)遍歷數(shù)組內(nèi)所有元素的方法
在js中數(shù)組遍歷最簡(jiǎn)單的辦法就是使用for然后再利用arr.length長(zhǎng)度作為for最大限度值即可解決了,下面我們來看看一些有用的實(shí)例2014-01-01