Emilio Nicolás Mendoza Patti
Miquel Ortiz
Super buena bro!!
Jeisson Santiago Cortes Ortiz
Podrias explicar un poco que fue lo que hiciste y porque ta problema de cors?
Una necesidad muy común desde un front-end es la descarga de archivos provenientes de un servidor. Veamos cómo puedes manipular este tipo de información y lograr que el usuario pueda descargar un archivo.
Manipulando datos binarios
Los datos se transladan en forma binaria a través del canal de comunicación HTTP. Vamos a recibir dichos datos binarios y a manipularlos para crear el archivo.
1. Servicio para el manejo de archivos
Comienza creando un servicio para realizar peticiones y manipular archivos.
// services/files.service.ts import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class FilesService { constructor() { } getFile(urlFile: string): Promise<any> { return fetch(urlFile, { method: 'GET', }); } }
En el método getFile() hace un fetch a una URL para obtener el Buffer del archivo.
Un Buffer es un espacio en la memoria que almacena datos binarios. En NodeJS, es posible acceder a estos espacios de memoria con la clase Buffer. Los búferes almacenan una secuencia de enteros, de forma similar a una matriz en Javascript. Del lado del front-end, es posible recibir un búfer de datos y manipularlo para convertirlo en un PDF, un XLS, entre otros.
2. Convertir datos binario en un archivo
Al realizar la solicitud y recibir el Buffer, lo convertimos en Blob para posteriormente creamos una URL temporal con URL.createObjectURL() pasándole dicho Blob y abriendo una nueva pestaña utilizando window.open() en el navegador.
openFile(): void { this.filesService.getFile('../../../assets/dummy.pdf') .then(response => response.blob()) .then(pdf => { window.open(URL.createObjectURL(pdf), '_blank'); }) .catch(err => { console.log(err); }); }
La manipulación de archivos es esencial, cada navegador interpreta los tipos de datos de una manera distinta. Es común encontrarse con comportamientos distintos en cada navegador como por ejemplo, Chrome suele descargar directamente el archivo, mientras que Firefox lo abre en una nueva pestaña. Dependiendo tu necesidad, asegúrate de probar tu aplicación en varios navegadores diferentes.
Contribución creada por: Kevin Fiorentino.
librería
npm i file-saver
tipado
npm install @types/file-saver --save-dev
Emilio Nicolás Mendoza Patti
Miquel Ortiz
Super buena bro!!
Jeisson Santiago Cortes Ortiz
Podrias explicar un poco que fue lo que hiciste y porque ta problema de cors?
Kevin Fiorentino
Siempre tengo problemas descargando archivos desde un S3 porque Chrome te lo descarga directamente y Firefox te lo abre en una nueva ventana. Lo que suelo hacer es capturar el Buffer del PDF, convertirlo en Blob y con el objeto window abrirlo en una nueva pestaña, en el caso de no querer descargarlo.
Nunca pude hacerlo con el HttpClient de Angular, Gracias Nicolas!
getPDF(): Promise<any> { return fetch(`url/to/pdf`), { method: 'GET', }); }
openPDF(): void { this.getPDF() .then(response => response.blob()) .then(pdf => { if (pdf) { window.open(URL.createObjectURL(pdf), '_blank'); } }) .catch(err => { console.log(err); }); }
Javier Alonso Rojas Butrón
Desde una pregunta de StackOverflow
As mentioned on the RxJS website:
With RxJS v7.2.0, most operators have been moved to 'rxjs' export site. This means that the preferred way to import operators is from 'rxjs', while 'rxjs/operators' export site has been deprecated.
Although the old way of importing operators is still active, it will be removed in one of the next major versions.
paula peña constain
Si quisiera realizar una previsualización del archivo antes de descargarlo como se podria hacer?
Genix Xavier Granados Elias
David Castro
Que pasó que pasó vamos ayyy
LEONARDO FERNANDEZ
que pasaría si mi archivo no tiene url? es decir si no es publico y esta guardado por ejemplo en S3
Hugo Bustamante
Tengo una duda. "new Blob" nos transforma entonces el contenido en un JSON? y con saveAs, se guarda en forma de archivo?
Nicolas Molina
ProfesorHola, lo que hace new Blob() es convertirlo en un archivo y saveAs lo que hace es que cuando se ejecuta esa función descarga el archivo.
Ever Eduardo Chicas Prado
Instalar librería para uso de archivos angular
Bueno algo interesante cuando intente descargalor normalmente me paso que pum!! eror de CORS pero dije no yo se resolver esto entonces ni lento ni peresoso...
Funcion:
downloadPdf(){ this.filesService.getfile('my.pdf', '/pdf.js/web/compressed.tracemonkey-pldi-09.pdf', 'application/pdf') .subscribe() }
Proxy:
{ "/api/*": { "target": "https://young-sands-07814.herokuapp.com", "secure": true, "logLevel": "debug", "changeOrigin": true }, "/pdf.js/web/*": { "target": "https://mozilla.github.io", "secure": true, "logLevel": "debug", "changeOrigin": true } }
y listo...