当前位置: 首页 > 知识库问答 >
问题:

如何在Angular中从数据库下载和保存ASP.NET Core API中的pdf文件?

韩安顺
2023-03-14

我的Angular项目无法通过ASP.NET core API下载(另存为)pdf文件。pdf文件存储在SQL Server中。

我尝试了stackoverflow中发布的许多方法,但没有一种对我有效。有些示例下载了一个pdf文件,但如果试图打开它,它会发现一个错误“..不支持..损坏”。

API(我倾向于返回一行,而不是仅返回一个vaule字节[])

[HttpGet]
        [Route("detail/{studentid:int}/{reportSeq:int}")]
        public async Task<ActionResult<byte[]>> GetStudentAcademicReport2(int StudentID, int ReportSeq)
        {            
            var report = await _context.AcademicReportDetails.FromSql("select * from [dbo].[ufnStudentAcademicReport] (8213, 8158)").FirstOrDefaultAsync();
            if (report == null)
            {
                return NotFound();
            }
            return report.ReportContent;
        }
  1. 不工作在角度

this.httpclient.get(“https://localhost:44369/api/values/detail/8213/8158”,{responseType:'blob'})
.subscribe(response=>{console.log(响应);

  const url = window.URL.createObjectURL(new Blob([response]));
  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', 'file.pdf');
  document.body.appendChild(link);
  link.click();

this.httpclient.get(“http://localhost:5000/api/studentAcademicReports/detail/8213/8158”,{responseType:'arraybuffer'})
.subscribe(response=>{console.log(响应);

  const file = new Blob([response], {type: 'application/pdf'});
  const fileURL = window.URL.createObjectURL(file);

  let objectURL = 'data:image/jpeg;base64,' +  response;
  let fileURL2 = this.sanitizer.bypassSecurityTrustUrl(objectURL); 

  const link = document.createElement('a');
  link.href = fileURL;
  link.download = 'sample.pdf';
  link.click();

在Windows窗体项目中工作

cmd.commandtext=“Select*from[dbo].[ufnStudentAcademicReport](8213,8158)”;Cmd.CommandType=CommandType.Text;

                if (cmd.Connection.State != ConnectionState.Open)
                {
                    cmd.Connection.Open();
                }

                DbDataReader read = cmd.ExecuteReader();
                if (read.HasRows)
                {
                    while (read.Read())
                    {
                        byte[] b = null;                                
                        b = (byte[])read.GetValue(read.GetOrdinal("ReportContent"));
                        System.IO.File.WriteAllBytes(@"c:\temp\test.pdf", b);    
                    }    
                }

无法通过API在Windows窗体项目中工作

        var content = await NewResponse.Content.ReadAsByteArrayAsync();

        System.IO.File.WriteAllBytes(@"c:\temp\test111.pdf", content);

共有1个答案

阳昊
2023-03-14

当您从ASP.NET Core操作返回byte[]时,它的结果是base64编码的,这就是您得到一个“损坏”文件的原因。您必须从action返回fileResult,以便让框架正确处理二进制数据

public async Task<FileResult> GetStudentAcademicReport2(int StudentID, int ReportSeq)
{
    var report = await _context.AcademicReportDetails.FromSql("select * from [dbo].[ufnStudentAcademicReport] (8213, 8158)").FirstOrDefaultAsync();
    if (report == null)
    {
        return NotFound();
    }
    return File(report.ReportContent, "application/pdf", "test.pdf");
}
 类似资料:
  • Error:SyntaxError:在JSON中,在XMLHttpRequest.onload Oketask(http://localhost:4200/polyfills.js:2780:60)在zone.push../node_modules/zone.js/dist/zone.js.zone.runtask(http://localhost:4200/polyfills.js:2553:4

  • 问题内容: 我需要下载存储在数据库中的文件。我认为我正确地执行了查询并称之为查询,但我不知道如何将其连接到JSF页面中的按钮。我也想知道,在将图像传递到JSF页面之前,是否必须将该图像保存在服务器的文件夹中。如果是这样,我该怎么做? 这是我用来从db返回byte []的查询: 这是一个简单的EJB,它调用该查询然后获取ID: 现在,这是令我困惑的部分,我如何才能将其与JSF页面和托管bean结合起

  • 我正在尝试下载一个运行时生成的PDF文件(使用iTextPDF生成的PDF文件)在Springboot服务,并希望通过angular 6.0在新选项卡中打开该文件。我试着遵循这个,如何下载一个在我的服务器(springboot)上生成的angular的pdf文件?但错误为“无法加载PDF文档”。代码出了什么问题? Springboot服务:

  • 问题内容: 我尝试使用以下代码下载pdf文件。它存储在应用程序数据中。但是我需要在iPhone的 “文件” 文件夹中显示下载的pdf 。 可能吗?? 问题答案: 这是下载任何文件并保存到“照片”(如果是图像文件)或“文件”(如果是pdf)的方法

  • API将返回CSV/PDF/XLS类型的文件 问题: