簡體   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