从byte[]下载PDF文件

6

我一直在努力通过ASP.Net MVC C#从bytes[]下载PDF文件。以下代码运行良好。

我需要将该代码转换为.NET Core,以实现相同的PDF下载过程。

string fileName = "testFile.pdf";

byte[] pdfasBytes = Encoding.ASCII.GetBytes(fileBytes);   // Here the fileBytes are already encoded (Encrypt) value. Just convert from string to byte
Response.Clear();
MemoryStream ms = new MemoryStream(pdfasBytes);
Response.ContentType = "application/pdf";
Response.Headers.Add("content-disposition", "attachment;filename=" + fileName);
Response.Buffer = true;
ms.WriteTo(Response.OutputStream);
Response.Flush();
Response.End();

我试图将上面的代码转换为.NET Core。但出现了错误:OutputStream方法没有这个ms.WriteTo(Response.OutputStream)行中的Response。 提前感谢!


1
我非常确定 byte[] pdfasBytes = Encoding.ASCII.GetBytes(fileBytes) 无法正确加载(二进制的)PDF文件的字节。 - Hans Kesting
1
你所说的“加密”是什么意思?如果文件已经被加密,客户端是否知道如何将其用作PDF文件? - Lasse V. Karlsen
@Lasse,filebytes变量使用GetStream()方法存储编码值,该值通过字符串变量传递到另一个函数。因此,在这里我将其转换为byte[]。使用上述代码在.NET MVC中成功下载PDF。我想将此代码转换为.NET Core。Response.Outputstream在.NET Core中无法获取。 - debugger
将PDF文件编码为ASCII字符串会丢失所有值大于127的字节。您是否使用文本PDF格式? - Luaan
显示剩余2条评论
2个回答

7

@Luaan先生已经回答了,但也许我的代码也能帮到你,所以我分享一下。

从文件夹中下载PDF文件

[HttpGet]
        public FileStreamResult DownloadPdfFile(string fileName)
        {            
            var stream = new FileStream(Directory.GetCurrentDirectory() + "\\wwwroot\\WriteReadData\\" + fileName, FileMode.Open);
            return new FileStreamResult(stream, "application/pdf");
        }

从数据库中下载PDF文件。
[HttpGet]
        public FileStreamResult DownloadFileFromDataBase(string id)
        {
            var _fileUpload = _db.FileUpload.SingleOrDefault(aa => aa.fileid == id);         // _fileUpload.FileContent type is byte
            MemoryStream ms = new MemoryStream(_fileUpload.FileContent);
            return new FileStreamResult(ms, "application/pdf");
        }

更多信息请参阅此问题和答案。 使用Asp.net core将PDF返回给浏览器


1
它运行良好。感谢您的支持。@Luaan 也感谢您的支持。 - debugger
非常欢迎您,您真是太好了。如果您给我的答案点个赞,我会感到非常荣幸。 - Nripendra Ojha

5

MVC 简化了这个过程。您只需要拥有一个返回 ActionResult 的操作即可:

public ActionResult GetImage()
{
  string fileName = "testFile.pdf";
  var pdfasBytes = ...;

  return File(pdfasBytes, "application/pdf", fileName);
}

@Luan,代码已经执行但文件没有下载。请提供其他解决方案。 - debugger
1
@debugger 好的,如果你只是在另一部分 C# 代码中执行它,它不会起作用 - ActionResult 必须从某个端点返回。你原来的代码破坏了请求管道并粗鲁地破坏了整个流程,所以你几乎可以在任何地方执行它,但这对于这段代码不起作用。您是否有问题从控制器中的方法正确返回 ActionResult?听起来您的 MVC 应用程序是从旧的 WebForms 应用程序快速移植过来的;您真的想避免使用 MVC 的方式吗? - Luaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接