首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法下载C#文件的返回文件

无法下载C#文件的返回文件
EN

Stack Overflow用户
提问于 2022-03-29 20:18:07
回答 2查看 821关注 0票数 0

我正在尝试用MVC项目下载这样的文件:

主计长:

代码语言:javascript
运行
复制
  [HttpPost]
        [ActionName("ExportList")]
        public async Task<IActionResult> ExportList(List<object> objectList)
        {
            var fileName = "fileName" ".xlsx";
            try
            {
                var fileContent = await _serviceLayer.ExportListToExcel(objectList);
                return File(fileContent, "application/vnd.ms-excel", fileName);
                // return new JsonResult("ok");
            }
            catch(Exception ex)
            {
                return BadRequest(ex.Message);
            }
        } 

那么我的服务层:

代码语言:javascript
运行
复制
public Task<byte[]> ExportListToExcel(List<object> objectList)
        {
            try
            {
               using(var workbook = new XLWorkbook())
                {
                    var worksheet = workbook.Worksheets.Add("Report");
                    var currentRow = 1;

                    #region Header
                    worksheet.Cell(currentRow, 1).Value = "val1";
                    worksheet.Cell(currentRow, 2).Value = "val2";
                    worksheet.Cell(currentRow, 3).Value = "val3";
                    #endregion

                    #region Body
                    foreach(var obj in objectList)
                    {
                        currentRow++;
                        worksheet.Cell(currentRow, 1).Value = obj.val1;
                        worksheet.Cell(currentRow, 2).Value = obj.val2;
                        worksheet.Cell(currentRow, 3).Value = obj.val3;
                    }
                    #endregion

                    using(var stream = new MemoryStream())
                    {
                        workbook.SaveAs(stream);
                        var content = stream.ToArray();

                        return Task.FromResult(content);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error");
            }
        }

我用ajax调用控制器方法:

代码语言:javascript
运行
复制
 function exportList() {
                 $.ajax({
                    type: "POST",
                    url: "@Url.Action("ExportList")",
                     data: { objectList: objectList},
                    dataType: "json",
                    success: function (data) {
                       //show success message
                    }, error: function (req, status, error) {
                       //show error message
                  }
            });
        }

我读了很多帖子,这是他们建议下载文件的建议,但相反,我返回到视图时会收到以下错误消息,并且文件没有下载,但是控制器没有抛出任何类型的异常消息:

有什么办法下载这个文件吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-29 21:42:43

试试Blob responseType

代码语言:javascript
运行
复制
$.ajax({
   type: "POST",
   url: "@Url.Action("ExportList")",
   data: { objectList: objectList},
   xhrFields: {
      responseType: 'blob' // FileContentResult will return as blob
   },
   success: function (data) {
      const url = window.URL.createObjectURL(data); // create url from blob
      const link = document.createElement('a'); // create anchor at DOM
      link.href = url; 
      link.setAttribute('download', 'file.xlsx'); // download attribute
      document.body.appendChild(link);
      link.click(); // trigger click for download
   },
   error: function (req, status, error) {
      //show error message
   }
});
票数 3
EN

Stack Overflow用户

发布于 2022-03-29 21:53:04

嗨,您的问题是javascript函数exportList(),最好在文件所在位置创建一个重定向,然后下载它。用你们的出口方法

这将是ExportList控制器方法的一部分:

代码语言:javascript
运行
复制
// Generate a new unique identifier against which the file can be stored
                string handle = Guid.NewGuid().ToString();    
                using (MemoryStream memoryStream = new MemoryStream())
                {
                   //save your file to memory stream
                    workbook.SaveAs(memoryStream);
                    memoryStream.Position = 0;
                    TempData[handle] = memoryStream.ToArray();
                }
    
                // Note we are returning a filename as well as the handle
                return new JsonResult()
                {
                    Data = new { FileGuid = handle, FileName = "exporfile.xlsx" , FileType="xlsx"}
                };

下载文件应该如下所示:

代码语言:javascript
运行
复制
 public virtual ActionResult Download(string fileGuid, string fileName, string fileType)
        {
            if (TempData[fileGuid] != null)
            {
                byte[] data = TempData[fileGuid] as byte[];
                if (fileType == "xlsx" || fileType == "xls")
                {
                    return File(data, "application/vnd.ms-excel", fileName);
                }
                else if (fileType == "pdf")
                {
                    return File(data, "application/pdf", fileName);
                }
                else
                {
                    //sin especificar...
                    return File(data, "application/octet-stream", fileName);
                }
            }
            else
            {
               
                return new EmptyResult();
            }
        }

然后更改exportlist方法:

代码语言:javascript
运行
复制
 function exportList() {
                 $.ajax({
                    type: "POST",
                    url: "@Url.Action("ExportList")",
                     data: { objectList: objectList},
                    dataType: "json",
                    success: function (data) {
                       var response = JSON.parse(data);
                    window.location = '/YourController/Download?fileGuid=' + response.FileGuid + '&filename=' + response.FileName +'&fileType=' + response.FileType;
                    }, error: function (req, status, error) {
                       //show error message
                  }
        });
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71668327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档