从 ASP.NET 酷睿 2 控制器返回 PDF



我正在尝试从我的 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")

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

最新更新