Descarga dañada en la aplicación AngularJs

Estoy intentando download un file usando FileSaver.js , pero obtengo un file dañado cada vez que presiono el button de descarga.

La aplicación está respaldada por un service REST de PHP, y el uso de cURL desde la command-line confirma que REST funciona correctamente.

Aquí está la última versión de pseudo-código que utilizo para download:

// Let str be the data received from $http promise // This code is run in a "then" callback var arr= new Uint8Array(str.length); for(var i=0; i<str.length; i++) { arr[b]=str.charCodeAt(i); }; var blob = new Blob([arr], {type: 'application/octet-stream'}); saveAs(blob, "AFileName"); 

Simplemente corrompe el file.

También lo intenté sin aplicar Uint8Array y dando str directamente a Blob . Como habrás adivinado, también falló.

Estoy escribiendo el server y el cliente yo mismo, así que puedo cambiar cualquier cosa en ellos. Pero el asunto es que quiero manejar las descargas del lado del cliente, y simplemente no puedo networkingireccionar a los usuarios a la URL del file para downloadlo, porque REST necesita authentication y ese token solo vive en la aplicación Angular. No sería una buena opción cambiar el server solo para gestionar las descargas de files sin authentication.

REST tiene URL como /files/:id que, cuando se accede, proporciona contenido de file como una descarga normal de files HTTP (probado con cURL como se dijo anteriormente). Podría $http ser el problema? De alguna manera forzando algún tipo de encoding o algunas suposiciones en los datos recibidos. No tengo mucha experiencia en Angular, de todos modos.

He encontrado el problema. Fui yo 🙂

Tuve que especificar responseType: "arraybuffer" para $http luego dar str directamente a Blob .

Código fijo

 // Let str be the data received from $http promise // This code is run in a "then" callback // Make sure to specify "responseType: "arraybuffer"" for $http var blob = new Blob([str], {type: 'application/octet-stream'}); saveAs(blob, "AFileName"); 

Estaba cambiando responseType en el lugar equivocado.