繁体   English   中英

从ASP.NET Core 2控制器返回PDF

[英]Returning a PDF from an ASP.NET Core 2 Controller

我试图从我的ASP.NET Core 2控制器返回一个PDF文件。 我有这个代码(大多是从这个SO问题借来的):

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.

试图和最后一个块试图修复它,从另一个SO问题。

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

理想情况下,我不想先将文件保存在服务器上,然后将其返回给控制器。 我宁愿把它留在记忆中。

finally将始终被调用( 即使在return ),因此它总是会在将内容流发送到客户端之前将其丢弃,因此会出错。

理想情况下,我不想先将文件保存在服务器上,然后将其返回给控制器。 我宁愿把它留在记忆中。

使用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"
        };
    }
}

无需额外的内存流

您必须指定:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM