使用Ajax生成的Excel文件並下載

来源:http://www.cnblogs.com/winsonet/archive/2016/11/18/6078070.html
-Advertisement-
Play Games

很久沒有寫文章啦,今天分享一個如何在ASP.NET MVC里使用Ajax下載生成文件的方法,以下只是個人心得: 大家都應該知道,在ASP.NET MVC里,如果通過Ajax調用後臺控制器時,可以返回一個JSON對象,但並不能直接返迴文件(除非刷新頁面,那就不是Ajax啦),所以如果想用Ajax生成文 ...


很久沒有寫文章啦,今天分享一個如何在ASP.NET MVC里使用Ajax下載生成文件的方法,以下只是個人心得:
 
大家都應該知道,在ASP.NET MVC里,如果通過Ajax調用後臺控制器時,可以返回一個JSON對象,但並不能直接返迴文件(除非刷新頁面,那就不是Ajax啦),所以如果想用Ajax生成文件並下載的話,那隻要將生成的文件先保存到服務器上,然後再將文件路徑通過JSON返回,之後才可以進行下載,當然由於是暫時性存放,所以當下載完後就需要馬上刪除相應的文件。
 
以下是做法以動態生成Excel為例(生成Excel的具體步驟我就省略了,這並不是此文章的重點):
 
1. 首先創建Action生成Excel文件
[HttpPost]
public JsonResult ExportExcel()
{
    DataTable dt = DataService.GetData();
    var fileName = "Excel_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls";
    //將生成的文件保存到服務器的臨時目錄里
    string fullPath = Path.Combine(Server.MapPath("~/temp"), fileName);
 
    using (var exportData = new MemoryStream())
    {
        //如何生成Excel這里就不詳細說明啦,我這里對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. 創建下載用的 Action
[HttpGet]
[DeleteFileAttribute] //Action Filter, 下載完後自動刪除文件,這個屬性稍後解釋
public ActionResult Download(string file)
{
    //到服務器臨時文件目錄下載相應的文件
    string fullPath = Path.Combine(Server.MapPath("~/temp"), file);
    //返迴文件對象,這里用的是Excel,所以文件頭使用了 "application/vnd.ms-excel"
    return File(fullPath, "application/vnd.ms-excel", file);
}
 
3. 由於要做到下載完後自動刪除文件,所以再創建一個 Action Filter 
public class DeleteFileAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Flush();
        //將當前filter context轉換成具體操作的文件並獲取文件路徑
        string filePath = (filterContext.Result as FilePathResult).FileName;
        //有文件路徑後就可以直接刪除相關文件了
        System.IO.File.Delete(filePath);
    }
}
 
4. 最後在前臺添加 Ajax 調用的代碼:
//這里我使用了 blockUI 做loading...
$.blockUI({ message: '<h3>Please wait a moment...</h3>' });    
$.ajax({
    type: "POST",
    url: '@Url.Action("ExportExcel","YourController")', //調用相應的controller/action
    contentType: "application/json; charset=utf-8",
    dataType: "json",
}).done(function (data) {
    //console.log(data.result);
    $.unblockUI();
    //接收返回的文件路徑,此文件這時已保存到服務器上了
    if (data.fileName != "") {
        //通過調用 window.location.href 直接跳轉到下載 action 進行文件下載操作
        window.location.href = "@Url.RouteUrl(new { Controller = "YourController", Action = "Download"})/?file=" + data.fileName;
    }
});
 
5. 完!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 任何用戶最常做的事要數創建和編輯文件,包括文檔、報告和文字,vi(Visual Editor)是一個有效而相對簡單的全熒幕編輯,使用vi,只要記著少量基本指令,就可以開始起步,再學習其他更復 雜的指令,而系統管理員則使用vi管理和維護系統。vi是包含在SCO System V作業系統中的全熒幕編輯, ...
  • TensorFlow 這個不用多介紹了吧,大家都知道,Google的開源深度學習軟體庫,官網點這裡:https://www.tensorflow.org/ 當然這個工具官方支持裝在 Ubuntu 和 Mac OS X 上,想要在 Windows 下使用,就需要藉助 Docker 了,看了幾篇相關的 ...
  • HTTP API也有兩種操作:寫入和查詢,本文就先給大家介紹一下 InfluxDB的HTTP API的寫入操作方式。 在InfluxDB學習的上一篇文章:InfluxDB學習之InfluxDB的基本操作 中,我們提到 InfluxDB操作有三種方式,其中一種是HTTP API的方式。 HTTP AP ...
  • 1、get方式 發送頁 <form id="form1" runat="server"> <div> <a href="WebForm2.aspx?name=5">調轉到Form2</a> <asp:Button ID="button2" Text="跳轉頁面" runat="server" onc ...
  • 前面一片文章已經提高我們公司的異構(相容dubbo)SOA系統架構,解決了不少技術痛點,也還算比較完善,也順利推廣開來。 但是作為項目的開發者,自己產品的問題心裡是清楚的,離自己滿意還是有不小的距離。 在推廣的同時,我緊張的進入了下一個版本的開發,讓它更加完善。 原來的版本號是1.0,現在版本升級為 ...
  • ...
  • 抓緊時間,繼續寫教程,因為發現用戶期待的內容,都在業務處理那一塊。不得不繼續勤勞了。這節主要介紹工具欄區的玩法,詳情如下:... ...
  • 1.定義一個ToolTipController變數 private ToolTipController _mToolTipController = null; 2.封裝在一個方法中 protected void ToolTipController(GridControl gcData) { if ( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...