Necesito enviar una cadena codificada base64
a un cliente. Por lo tanto, estoy abriendo y leyendo un archivo de imagen en el servidor, lo codifico y envío esos datos junto con el tipo de contenido image/jpeg
al navegador. ejemplo en php:Enviar/Mostrar una imagen codificada en base64
$image = $imagedir . 'example.jpg';
$image_file = fopen($image, 'r');
$image_data = fread($image_file, filesize($image));
header("Content-type: image/jpeg");
echo 'data:image/jpeg;base64,' . base64_encode($image_data);
ClientSide, estoy llamando:
var img = new Image();
img.src = "http://www.myserver.com/generate.php";
img.onerror = function(){alert('error');}
$(img).appendTo(document.body);
que no funciona por alguna razón. onerror
siempre dispara. Al ver el FireBug Network task
, por ejemplo, me dice que estoy recibiendo la información de encabezado correcta y un valor correcto de los bytes transferidos.
Si envío esos datos como Content-type: text/plain
funciona, la cadena base64
se muestra en el navegador (si invoco el script directamente). Copiando y pegando esa salida en el src
de un elemento <img>
muestra la imagen como se esperaba.
¿Qué estoy haciendo mal aquí?
Solución
Gracias Pekka
por dirigirme en mi error. No necesita (¡no puede!) Codificar esos datos de imagen binarios como cadena base64 en ese tipo de enfoque. Sin la codificación base64, simplemente funciona.
parece que debería dar el valor del atributo 'de src' al texto de respuesta directa (es decir,' img.src = "data: image/jpeg; base64, ..." '... y el lado derecho aquí podría ser un valor de retorno de una llamada Ajax) - de lo contrario, el navegador intentará solicitar una imagen de la URL que ' volver a establecerlo, que no funcionará porque devuelve 'data: image ...' en lugar de los bytes de la imagen directamente. –
¿Qué quieres hacer? – Hello71
No quiero la sobrecarga de una llamada 'ajax'. Lo necesito tan rápido como sea posible. Para obtener una especie de 'respuesta', necesito una imagen válida para verificar el ancho, por ejemplo. – jAndy