0
我在過濾數據表的頁面上有過濾器。如何使用ajax window.location下載文件
還有一個獨立的按鈕,用於導出數據爲excel。
我按照這個例子:Download Excel file via AJAX MVC
當點擊了出口按鈕jQuery的讀取所有的過濾器值並把結果作爲以下傳遞迴服務器:
$.ajax({
url: url,
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: filterData
}).done(function (returnData) {
if (returnData.success) {
window.location = returnData.locationUrl;
}
});
在我有2個服務器動作
[HttpPost]
public ActionResult ExportTo(SearchVm searchVm)
{
var data = _service.GetSearchTerm(searchVm).Take(150).ToList();
string handle = Guid.NewGuid().ToString();
TempData[handle] = data;
var fileName = $"C-{handle}.xlsx";
var locationUrl = Url.Action("Download", new { fileGuid = handle, fileName });
var downloadUrl = Url.Action("Download");
return Json(new { success = true, locationUrl, guid = handle, downloadUrl }, JsonRequestBehavior.AllowGet);
}
[HttpGet]
public ActionResult Download(string fileGuid, string fileName)
{
if (TempData[fileGuid] != null)
{
var fileNameSafe = $"C-{fileGuid}.xlsx";
var data = TempData[fileGuid] as List<Company>;
using (MemoryStream ms = new MemoryStream())
{
GridViewExtension.WriteXlsx(GetGridSettings(fileNameSafe), data, ms);
MVCxSpreadsheet mySpreadsheet = new MVCxSpreadsheet();
ms.Position = 0;
mySpreadsheet.Open("myDoc", DocumentFormat.Xlsx,() =>
{
return ms;
});
byte[] result = mySpreadsheet.SaveCopy(DocumentFormat.Xlsx);
DocumentManager.CloseDocument("myDoc");
Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", $"attachment; filename={fileNameSafe}");
Response.BinaryWrite(result);
Response.End();
}
}
return new EmptyResult();
}
上面的代碼工作正常,下載本地計算機上的文件。但是,當我在服務器上生效時,導出按鈕單擊會將用戶指向URL而不是下載文件。
我不明白爲什麼會發生這種情況。該應用程序託管在Azure Web服務上。我能看到的地方和生產之間唯一的區別是生產有ssl。
window.location是否有任何限制?爲什麼它會強制瀏覽器在本地機器上下載文件,但它會將用戶重定向到生產環節?
我檢查了鉻控制檯,沒有錯誤。
任何想法爲什麼?
感謝,
您是否嘗試過'window.location.href'? –
是的,我試了兩個和window.open(url,'_blank');以及。但仍然在我的本地工作正常,但在服務器上它將用戶導向到URL而不是下載文件。 – akd