【发布时间】:2020-01-28 23:59:44
【问题描述】:
我的 Angular 项目无法通过 ASP.NET 核心 Api 下载(另存为)pdf 文件。 pdf文件存储在SQL server中。
我尝试了许多在 stackoverflow 中发布的方法,但没有一个适合我。一些示例下载了一个 pdf 文件,但如果尝试打开它,则会发现错误“..not support...damaged”。
API(我更喜欢只返回一行而不是单个 vaule byte[])
[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;
}
- 不适用于 Angular
this.httpClient.get("https://localhost:44369/api/values/detail/8213/8158", { responseType: 'blob'})
. 订阅(响应 => {
控制台日志(响应);
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'})
. 订阅(响应 => { 控制台日志(响应);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 = "从 [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 窗体项目中工作
HttpClient http = new HttpClient(); var NewResponse = 等待 http.GetAsync("https://localhost:44369/api/values/detail/8213/8158");
var content = await NewResponse.Content.ReadAsByteArrayAsync();
System.IO.File.WriteAllBytes(@"c:\temp\test111.pdf", content);
从我上面的示例代码中可以看出,如果使用 SQLCommand 直接下载 varbinary(Max) 中的 pdf,则它可以工作,但如果通过 API 下载 pdf,则它不起作用。我怀疑 API 以 Json 格式返回 byte[]。学生照片通过 api 成功显示,没有任何问题,但下载 Pdf 文件不起作用。是什么导致下载的 PDF 文件在我的代码中损坏?
【问题讨论】:
标签: arrays angular api pdf asp.net-core