是否可以使用ajax.beginform下载文件?还是ajax?

时间:2015-06-30 10:02:49

标签: c# asp.net-mvc

这是我的控制器的代码:

[HttpPost]
    public async Task<ActionResult> DownloadItemList(int subcampaignId, string SheetName, string filename)
    {

        DataSet ds = new DataSet();

        string url = string.Format("api/report/subcampaign/{0}", subcampaignId);

        var response = await req.GetXMLAsync(url);
        XmlDocument xmlDoc = new XmlDocument();
        try
        {
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();

                xmlDoc.PreserveWhitespace = true;

                xmlDoc.LoadXml(content);

                XmlNodeReader xmlReader = new XmlNodeReader(xmlDoc);

                ds.ReadXml(xmlReader);


            }


            IDataTableToWorkbookUtility workbookExportUtility = new DataTableToWorkbookUtility();

            byte[] excelContent = workbookExportUtility
            .ExportDataTableToWorkbook(ds.Tables[0], SheetName)
            .GetBytes();

            return this.File(excelContent, "application/vnd.ms-excel", filename + ".xls");
        }
        catch (Exception e)
        {
            log.Debug("CampaignListController/GetAudio: " + e.Message);
            throw;
        }
    }

当我使用ajax.beginform ..而不是下载文件时,响应被读作文本。我想使用ajax,因为我想在使用时单击提交按钮显示加载栏..我想要做的就是在等待文件下载时显示加载状态

2 个答案:

答案 0 :(得分:0)

实际上,您无法通过AJAX上传或下载文件。

你可以尝试下面的场景

如果成功找到/创建了文件。使用指向该文件的链接发回JSON结果。然后在javascript中使用windows.location来检索文件。当出现错误时,JSON结果将包含错误信息,并且可以向用户显示此信息。为此,您需要创建另一个可以流式传输文件的端点(操作)。

 $.ajax({
    ..
     success: function(data)
     {
      if( data.result=='success' ){
        window.open(download_path + data.fileName); 
        }        
     }
    ..
    })

答案 1 :(得分:0)

实际上你可以,你需要使用blueimp的文件上传jquery plugin。它有很多选项并支持跨域。

它还有一个可以实现的加载栏。