【问题标题】:Returning a PDF from an ASP.NET Core 2 Controller从 ASP.NET Core 2 控制器返回 PDF
【发布时间】:2023-03-25 11:40:01
【问题描述】:

我正在尝试从我的 ASP.NET Core 2 控制器返回一个 PDF 文件。 我有这个代码 (主要是借用这个SO question):

var net = new System.Net.WebClient();
//a random pdf file link
var fileLocation = "https://syntera.io/documents/T&C.pdf";/
var data = net.DownloadData(fileLocation);
MemoryStream content = null;
try
{
    content = new MemoryStream(data);
    return new FileStreamResult(content, "Application/octet-stream");
}
finally
{
    content?.Dispose();
}

上面的这段代码是我的控制器调用的服务类的一部分。这是来自我的控制器的代码。

public async Task<IActionResult> DownloadFile(string fileName)
{
    var result = await _downloader.DownloadFileAsync(fileName);
    return result;
}

但我不断收到ObjectDisposedException: Cannot access a closed Stream.

try and finally 块是尝试修复它,来自另一个 SO 问题。

主要问题是 A) 这是将 PDF 文件发送回浏览器的正确方法吗?B) 如果不是,我该如何更改代码以将 pdf 发送回浏览器?

理想情况下,我不想先将文件保存在服务器上,然后再将其返回给控制器。我宁愿把它还给它,同时把所有东西都放在内存中。

【问题讨论】:

  • 您添加try/finally之前的确切代码是什么? try/finally 肯定会导致 ObjectDisposedException 所以在你介绍它之前看看发生了什么会很有用。

标签: c# asp.net-core


【解决方案1】:

finally 总是会被调用(即使在 return 之后),所以它总是会在内容流发送到客户端之前处理它,因此会出现错误。 p>

理想情况下,我不想先将文件保存在服务器上,然后再将其返回给控制器。我宁愿把它还给它,同时把所有东西都放在内存中。

使用FileContentResult 类获取原始字节数组数据并直接返回。

FileContentResult:表示ActionResult,执行时会将二进制文件写入响应。

async Task<IActionResult> DownloadFileAsync(string fileName){
    using(var net = new System.Net.WebClient()) {
        byte[] data = await net.DownloadDataTaskAsync(fileName);
        return new FileContentResult(data, "application/pdf") {
            FileDownloadName = "file_name_here.pdf"
        };
    }
}

不需要额外的内存流

【讨论】:

    【解决方案2】:

    您必须指定:

    Response.AppendHeader("content-disposition", "inline; filename=file.pdf");
    return new FileStreamResult(stream, "application/pdf")
    

    用于在浏览器中直接打开的文件。

    【讨论】:

    • 这对ObjectDisposedException 确实没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2021-06-26
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多