Estoy tratando de descargar un archivo usando la función JS Blob(), pero no puedo abrirlo. No está claro qué tipo de antemano, ya que obtuve una lista de archivos, el usuario puede elegir qué descargar. Mac dice que el formato podría estar dañado y que no puede abrir ese archivo.
La respuesta de cURL que tengo, a partir de la cual creo un blob, es una cadena binaria (al menos eso creo porque cuando la descargo, solo ves símbolos y caracteres aleatorios, como cuando abres una imagen con el editor de texto)
Aquí está el código de la imagen tal como lo tengo a través de la respuesta de mi cURL
y aquí está mi código para descargar esta imagen.
var a; a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([JSON.stringify(response)])); // here i tried with and without JSON.stringify // also tried new Blob([JSON.stringify(response)],{type:'image/jpeg'}) or with * instead of jpeg, nothing works. Does anybody happen to know what mistake i am doing? a.download = data.data.name; a.style.display = 'none'; document.body.appendChild(a); a.click();He estado luchando con esto durante unos días, cualquier ayuda es apreciada.
También cuando yo (en Mac Terminal) hago el siguiente comando:
file test.jpegvuelve
test.jpeg: dataSaludos
EDITAR: Mi código PHP
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://myapi.com/webapp/api/v1/document/id/" . $id . "/download"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('AuthenticationToken:' . $token)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); echo $output;Puede intentar serializar los datos de la imagen en una cadena base64 y pasarla al cliente
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://myapi.com/webapp/api/v1/document/id/" . $id . "/download"); curl_setopt($ch, CURLOPT_HTTPHEADER, array("AuthenticationToken:" . $token)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); $base64 = "data:/" . $contentType . ";base64," . base64_encode($output); echo $base64;En este caso, en su lado del cliente solo necesita poner el texto de respuesta para el href de esta manera:
const a = document.createElement('a'); a.href = response; a.download = data.data.name; a.style.display = 'none'; document.body.appendChild(a); a.click();