从Postman打电话时无法下载Excel文件

ILo*_*low 6 c# excel asp.net-core asp.net-core-webapi

我正在尝试使用Web API下载Excel文件,但我无法在邮递员中下载文件,因为我在浏览器中输入URL时能够下载Excel文件虽然在打开文件时我收到如下警告消息:

在此输入图像描述

在此输入图像描述

在此输入图像描述

当我使用POSTMAN命中端点时,文件被破坏并显示垃圾字符.

代码:

protected virtual byte[] ExportToXlsx<T>(IEnumerable<T> itemsToExport)
        {
            using (var stream = new MemoryStream())
            {
                using (var xlPackage = new ExcelPackage())
                {
                    // get handles to the worksheets
                    var worksheet = xlPackage.Workbook.Worksheets.Add(typeof(T).Name);

                    //create Headers and format them 
                    var manager = new PropertyManager<T>(itemsToExport.First());
                    manager.WriteCaption(worksheet, SetCaptionStyle);

                    var row = 2;

                    foreach (var items in itemsToExport)
                    {
                        manager.CurrentObject = items;
                        manager.WriteToXlsx(worksheet, row++, false);
                    }

                    xlPackage.Save();
                }
                return stream.ToArray();
            }
        }



private readonly IServiceContext ctx;
public void Download(string guid)
{
   var bytes = ExportToXlsx(list);
   ctx.reqobj.HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=\"demo.xlsx\"");
   ctx.reqobj.HttpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
   ctx.reqobj.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
}
Run Code Online (Sandbox Code Playgroud)

注意:我OfficeOpenXml用于创建Excel文件.

我将不胜感激任何帮助.

更新: 在此输入图像描述

小智 5

尝试使用“发送并下载”而不是“发送”

https://www.getpostman.com/docs/v6/postman/sending_api_requests/responses


Nko*_*osi 2

需要将流传递给包。

现在包裹里没有任何东西,

//...

using (var xlPackage = new ExcelPackage())

//...
Run Code Online (Sandbox Code Playgroud)

因此,没有任何内容被保存到流中,这就是尝试打开文件时显示错误的原因。

无需将内存流转换为数组。返回流并将其传递给响应。

protected virtual Stream ExportToXlsx<T>(IEnumerable<T> itemsToExport) {
    var stream = new MemoryStream();
    using (var xlPackage = new ExcelPackage(stream)) { //<<< pass stream
        // get handles to the worksheets
        var worksheet = xlPackage.Workbook.Worksheets.Add(typeof(T).Name);
        //create Headers and format them 
        var manager = new PropertyManager<T>(itemsToExport.First());
        manager.WriteCaption(worksheet, SetCaptionStyle);
        var row = 2;
        foreach (var items in itemsToExport) {
            manager.CurrentObject = items;
            manager.WriteToXlsx(worksheet, row++, false);
        }
        xlPackage.Save();
    }
    return stream;
}
Run Code Online (Sandbox Code Playgroud)

返回文件的控制器操作如下所示

public IActionResult Download(string guid) {

    //...get list

    var file = ExportToXlsx(list);
    var contentType = "application/vnd.openxmlformats";
    var fileName = "demo.xlsx";

    return File(file, contentType, fileName); //returns a FileStreamResult
}
Run Code Online (Sandbox Code Playgroud)

评论中指出,上述是在支持方法中完成的。

使用相同的方法

private readonly IServiceContext ctx;

//...

public void Download(string guid) {

    //...get list

    using(var fileStream = ExportToXlsx(list)) {
        if (fileStream.CanSeek && fileStream.Position != 0) {
            fileStream.Seek(0, SeekOrigin.Begin);
        }
        var contentType = "application/vnd.openxmlformats";
        var fileName = "demo.xlsx";
        var response = ctx.reqobj.HttpContext.Response;
        response.Headers.Add("Content-Disposition", $"attachment; filename=\"{fileName}\"");
        response.Headers.Add("Content-Length", fileStream.Length.ToString());
        response.ContentType = contentType;
        fileStream.CopyTo(response.Body);
    }
}
Run Code Online (Sandbox Code Playgroud)

生成的文件被复制到响应正文中。

对于邮递员来说,该工具只是显示响应中返回的内容。它不会尝试将实际文件作为附件下载。