You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL LONGBLOB类型图片转BLOB后如何在img src中正常显示?

解决LONGBLOB图片转JSON后无法在HTML img中显示的问题

咱们先捋清楚问题:你把MySQL里LONGBLOB类型的图片数据通过接口返回成JSON,然后前端想用Blob URL在img标签里展示,但图片显示异常。这事儿的核心问题出在JSON没法直接传输二进制数据——当后端把LONGBLOB的二进制序列化成JSON时,二进制会被当成UTF-8字符串处理,原始的字节信息直接丢了,前端再转Blob自然还原不出正确的图片。

从你提供的截图来看:

当前图片显示情况:[图片无法正常加载,呈现损坏或空白状态]
picture字段数据:[显示为一堆乱码字符串,这是二进制数据被错误编码为文本后的结果]

怎么解决?

第一步:先改后端(最关键)

JSON是纯文本格式,不能直接带二进制,所以后端接口SelectLapbook必须把LONGBLOB的图片数据转成Base64编码字符串后再返回JSON。举个Java后端的例子(你可以根据自己的后端语言调整):

// 假设从数据库取出的picture是byte[]类型
String base64Picture = Base64.getEncoder().encodeToString(picture);
// 把这个base64Picture放到返回的JSON对象里

这样前端拿到的lapbooks[i].picture就是标准的Base64字符串,不是乱码了。

第二步:前端修改(两种方案任选)

方案一:直接用Data URL(简单省心)

不用搞Blob那一套,直接把Base64字符串拼成Data URL给img的src就行:

var selectLapbooks = function () { 
  var request = new XMLHttpRequest(); 
  request.open("GET", "SelectLapbook", false); 
  request.send(); 
  if (request.status === 200) { 
    var response = request.responseText; 
    var lapbooks = JSON.parse(response); 
    var element = document.getElementById("lapbooks"); 
    element.innerHTML = ""; 
    for (var i = 0; i < lapbooks.length; i++) { 
      // 这里要注意图片类型,比如你的图片是PNG就写image/png,是JPG就写image/jpeg
      var imgSrc = `data:image/png;base64,${lapbooks[i].picture}`;
      element.innerHTML += `<a href="#"><img class='card-img-top' src='${imgSrc}' alt='Lapbook图片'></a>`; 
    } 
  } 
};

方案二:转Blob后用Object URL(适合大图片)

如果图片特别大,Data URL可能有性能问题,那就把Base64解码成字节数组再转Blob:

// 先写个Base64转Uint8Array的工具函数
function base64ToUint8Array(base64) {
  var binaryString = window.atob(base64);
  var bytes = new Uint8Array(binaryString.length);
  for (var i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  return bytes;
}

var selectLapbooks = function () { 
  var request = new XMLHttpRequest(); 
  request.open("GET", "SelectLapbook", false); 
  request.send(); 
  if (request.status === 200) { 
    var response = request.responseText; 
    var lapbooks = JSON.parse(response); 
    var element = document.getElementById("lapbooks"); 
    element.innerHTML = ""; 
    for (var i = 0; i < lapbooks.length; i++) { 
      var imgBytes = base64ToUint8Array(lapbooks[i].picture);
      // 同样要指定正确的图片MIME类型
      var blob = new Blob([imgBytes], { type: 'image/png' }); 
      var imgSrc = window.URL.createObjectURL(blob);
      element.innerHTML += `<a href="#"><img class='card-img-top' src='${imgSrc}' alt='Lapbook图片'></a>`; 
      // 记得在图片不用的时候释放URL,避免内存泄漏
      // window.URL.revokeObjectURL(imgSrc);
    } 
  } 
};

额外提醒

  • 一定要确认图片的MIME类型,如果后端能把类型一起返回就更完美了,不然得根据你实际存储的图片格式调整。
  • 如果没法改后端的话,前端基本救不了——因为二进制转字符串的时候已经丢了信息,这时候必须让后端配合改成Base64编码返回。

内容的提问来源于stack exchange,提问作者Max Turchin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:19:12