Serwowanie pliku PDF jako binarna treść

0

Hej,

w bazie postgresql mam pliki .pdf. W .net typ danych byte[], w bazie bytea. Finalny cel to wyświetlenie przez klienta .pdf w przeglądarce w osobnym oknie, div'ie

Czy w taki sposób po prostu pobrać byte[]:

[HttpGet("file")]
public ActionResult<byte[]> GetPdf()
{
   var file = _dbContext
     .PublicFiles
     .Where(u => u.Id == 1)
     .Select(u => u.DataFile)
     .SingleOrDefault();

  if(file is null)
  {
    return NotFound();
  }
  return Ok(file);
}

dalej nie wiem co z tym zrobić na froncie ale to nie ten dział.

1
[Route("api/[controller]")]
public class DownloadController : Controller {
    //GET api/download/12345abc
    [HttpGet("{id}")]
    public async Task<IActionResult> Download(string id) {
        Stream stream = await {{__get_stream_based_on_id_here__}}

        if(stream == null)
            return NotFound(); // returns a NotFoundResult with Status404NotFound response.

        return File(stream, "application/octet-stream", "{{filename.ext}}"); // returns a FileStreamResult
    }    
}

Aby wyświetlić plik pdf w przeglądarce

<a href="https://mypage.pl/api/download/101" target="_blank">download<click>

Lub wyświetlić w konkretnym divie:
https://ej2.syncfusion.com/documentation/pdfviewer/getting-started/

2
gswidwa1 napisał(a):
[Route("api/[controller]")]
public class DownloadController : Controller {
    //GET api/download/12345abc
    [HttpGet("{id}")]
    public async Task<IActionResult> Download(string id) {
        Stream stream = await {{__get_stream_based_on_id_here__}}

        if(stream == null)
            return NotFound(); // returns a NotFoundResult with Status404NotFound response.

        return File(stream, "application/octet-stream", "{{filename.ext}}"); // returns a FileStreamResult
    }    
}

Aby wyświetlić plik pdf w przeglądarce

<a href="https://mypage.pl/api/download/101" target="_blank">download<click>

Lub wyświetlić w konkretnym divie:
https://ej2.syncfusion.com/documentation/pdfviewer/getting-started/

Ale wydaje mi się, że nie ma potrzeby tworzyć Stream skoro już tablica bytów jest.

Ja bym po prostu zrobił:

var dataFile = _dbContext
     .PublicFiles
     .Where(u => u.Id == 1)
     .Select(u => u.DataFile)
     .SingleOrDefault();

  if(file is null)
  {
    return NotFound();
  }
  return File(dataFile, "application/pdf", "FileDownloadName.ext");
0

dzięki.
link

<a href="https://mypage.pl/api/download/101" target="_blank">download<click>

w Chrome ściąga plik, w Firefox ściaga i otwiera w nowej karcie

wyguglałem jeszcze coś takiego na froncie (na backed ten sam kod jak w 1szym poście czyli zwracam byte[] )

    const showPdf = () => {
      getFile(); // byte[]

      let obj = document.createElement("object");
      obj.type = "application/pdf";
      obj.data = "data:application/pdf;base64," + byteFile.value;
      let newTab = window.open();
      newTab?.document.body.appendChild(obj);
    };

to dodaje mi object i ładnie wyświetla pdf w przeglądarce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1