Как скачать и сохранить PDF-файл из ASP.NET Core API из базы данных в Angular? - PullRequest
1 голос
/ 29 сентября 2019

Мой проект Angular не может загрузить (для Сохранить как) файл PDF через ядро ​​Api ASP.NET.PDF-файл хранится на сервере SQL.

Я пробовал несколько способов, опубликованных в 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. Не работает в Angular

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

  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);    
                    }    
                }

Не работает в проекте формы Windows через API

HttpClient http = new HttpClient(); var NewResponse = await 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);

Как видно из приведенных выше примеров кода, он работает, если PDF-файл в varbinary (Max) загружается напрямую с использованием SQLCommand, ноне работает, если PDF загружен через API. Я подозреваю, что API возвращает байт [] в формате Json. Фотографии учеников успешно отображаются через API без каких-либо проблем, но загрузка файла PDF не работает. Что вызывает загруженные файлы PDFповреждены в моих кодах?

1 Ответ

2 голосов
/ 30 сентября 2019

Когда вы возвращаете byte[] из действия ASP.NET Core, его результат кодируется base64, и поэтому вы получаете «поврежденный» файл.Вы должны вернуть 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...