Antes de comenzar con la pregunta, he revisado varias respuestas de stackoverflow sobre preguntas similares (incluidas las que se han hecho y no se han respondido hasta ahora). También he revisado uno de los artículos medianos. Por lo tanto, he hecho un poco de investigación.
He estado tratando de descargar varios archivos usando direcciones URL preestablecidas. El siguiente código funcionaba hace unos días (esto puede sonar familiar;)) pero actualmente, solo puedo descargar un archivo que también es aleatorio. A veces se descarga el primer archivo y otras veces el último. El código se proporciona a continuación:
downloadItem() { let urls = []; for(let item of this.selectedRowsData) { //calling the service to fetch the presigned url this.dataService.getPresignedToDownloadAll( item.value, item.id).subscribe((res) => { urls.push(res); this.download(urls); /**if(urls.length === selectedRowData.length) { this.download(urls); }**/ //have tried this code too where I just invoke download only once when I have all the presigned urls }); } } download(urls: any) { var self = this; var url = urls.pop(); setTimeout(function(){ self.snackBarService.loadComponent({ isSuccess: true, message: MESSAGES.downloadInProgress, }); var a = document.createElement('a'); a.setAttribute('href', url); document.body.appendChild(a); a.setAttribute('download', ''); a.setAttribute('target', '_self'); a.click(); // a.remove(); }, 1000) }Cualquier ayuda es muy apreciada.
No pude descargar las múltiples imágenes de las URL prefirmadas en la misma pestaña del navegador, que es lo que estaba tratando de hacer con a.setAttribute('target', '_self');
Pero pude hacer que funcionara configurando el objetivo como _blank, que abre una nueva pestaña pero cierra las pestañas abiertas una vez que finaliza la descarga. Aunque esta no es una gran experiencia para el usuario, a partir de ahora hemos seguido adelante con esta implementación. Así es como se ve el código final
downloadItem() { let urls = []; for(let item of this.selectedRowsData) { //calling the service to fetch the presigned url this.dataService.getPresignedToDownloadAll( item.value, item.id).subscribe((res) => { urls.push(res); this.download(urls); }); } } download(urls: any) { var self = this; var url = urls.pop(); setTimeout(function(){ self.snackBarService.loadComponent({ isSuccess: true, message: MESSAGES.downloadInProgress, }); var a = document.createElement('a'); a.setAttribute('href', url); document.body.appendChild(a); a.setAttribute('download', ''); a.setAttribute('target', '_blank'); a.click(); // a.remove(); }, 1000) }