代码之家  ›  专栏  ›  技术社区  ›  LePrinceDeDhump

从ASP.NET核心2控制器

  •  2
  • LePrinceDeDhump  · 技术社区  · 6 年前

    我正试图从我的邮箱返回一个PDF文件ASP.NET核心2控制器。 (大部分都是从这里借来的 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.

    “最后一次尝试”是试图从另一个所谓的问题来解决这个问题。

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

    理想情况下,我不想先将文件保存在服务器上,然后再将其返回给控制器。我宁愿把它还回去,同时把一切都记在记忆里。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Nkosi    6 年前

    这个 finally 总会接到电话的( 即使是在 return )因此,它总是在将内容流发送到客户端之前处理它,因此会出现错误。

    理想情况下,我不想先将文件保存在服务器上,然后再将其返回给控制器。我宁愿把它还回去,同时把一切都记在记忆里。

    使用 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
  •  1
  •   Hossein    6 年前

    必须指定:

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

    直接打开 在浏览器中。