2017-05-25 119 views
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是否有任何限制?为什么它会强制浏览器在本地机器上下载文件,但它会将用户重定向到生产环节?

我检查了铬控制台,没有错误。

任何想法为什么?

感谢,

+0

您是否尝试过'window.location.href'? –

+0

是的,我试了两个和window.open(url,'_blank');以及。但仍然在我的本地工作正常,但在服务器上它将用户导向到URL而不是下载文件。 – akd

回答

0

-return文件名和fileGuid到你的Ajax方法和连接动作网址,而不是在后端创建它,并调用下载操作。

- 改变返回的数据:

[HttpPost] 
    public ActionResult ExportTo(SearchVm searchVm) 
    { 
     var data = _service.GetSearchTerm(searchVm).Take(150).ToList(); 
     var 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, guid = handle, fileName=fileName }, JsonRequestBehavior.AllowGet); 
    } 

- 改变AJAX实现功能:

$.ajax({ 
    url: url, 
    type: 'POST', 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8', 
    data: filterData 
}).done(function (returnData) { 
     if (returnData.success) 
     { 
      window.open('/download/' +returnData.guid + '/' + returnData.fileName, '_blank', ''); 
     } 
    });