Jeder sollte wissen, dass Sie in ASP.NET MVC, wenn Sie den Hintergrundcontroller über Ajax aufrufen, ein JSON-Objekt zurückgeben können, die Datei jedoch nicht direkt zurückgeben können (es sei denn, Sie aktualisieren die Seite, dann ist es kein Ajax). Wenn Sie also Ajax zum Generieren und Herunterladen einer Datei verwenden möchten, müssen Sie die generierte Datei nur zuerst auf dem Server speichern und dann den Dateipfad über JSON zurückgeben. Anschließend können Sie sie natürlich herunterladen Zwischengespeichert wird, müssen Sie die entsprechenden Dateien sofort löschen.
Das Folgende ist ein Beispiel für die dynamische Generierung von Excel (ich habe die spezifischen Schritte zum Generieren von Excel weggelassen, dies ist nicht der Schwerpunkt dieses Artikels):
Erstellen Sie zunächst eine Aktion um eine Excel-Datei zu generieren
[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. Erstellen Sie eine Aktion zum Herunterladen
[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. Da Sie die Datei nach dem Herunterladen automatisch löschen möchten, erstellen Sie ein weiterer Aktionsfilter
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. Fügen Sie abschließend den Ajax-Aufrufcode im Vordergrund hinzu:
//這里我使用了 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; } });