我需要将一个 base64
编码的字符串发送给客户端。因此,我正在服务器上打开并读取一个图像文件,对其进行编码,然后将该数据与 image/jpeg
的内容类型一起发送到浏览器。
php中的示例:
$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, 我正在调用:
var img = new Image();
img.src = "http://www.myserver.com/generate.php";
img.onerror = function(){alert('error');}
$(img).appendTo(document.body);
由于某些原因,这并没有起作用。 onerror
总是触发。例如,在监视 FireBug 的网络任务时,它告诉我我正在接收正确的标头信息和传输字节的正确值。
如果我将那些数据发送为 Content-type: text/plain
,它可以正常工作,base64
字符串会在浏览器中显示(如果我直接调用脚本)。将该输出复制并粘贴到 <img>
元素的 src
中,就可以按预期显示图像。
我在这里做错了什么?
解决方案
感谢 Pekka
指出我的错误。您不需要(也不能!)将二进制图像数据编码为 base64 字符串来使用这种方法。没有进行 base64 编码,它就能正常工作。
src
属性的值设置为响应文本(即img.src =“data:image/jpeg;base64,...”
...这里的右侧可以是Ajax调用的返回值)-否则浏览器将尝试从您设置它的URL请求图像,但由于它返回的是data:image...
而不是图像字节,所以无法工作。 - John Raschajax调用
的开销。我需要尽可能快地得到它。为了获得某种“响应”,我需要一个有效的图像来检查其宽度。 - jAndy