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

求助:React中基于已有Image Blob URL创建新URL后无法显示图片

问题分析与解决方法

你的核心错误是把收到的Blob URL当成了原始二进制数据来处理。msg本身就是服务器返回的可用Blob URL,不需要再用它创建新Blob——你现在相当于把字符串形式的URL打包成了新Blob,生成的自然是无效的图片地址。

正确做法

直接使用收到的msg作为图片的src即可,不需要额外创建Blob和Object URL:

修正后的代码

useEffect(() => {
  const socketInstance = socket.current;
  if (socketInstance) {
    const handleMsgReceive = (msg) => {
      // 直接用msg(Blob URL)作为图片地址
      setArrivalMessage({ fromSelf: false, message: msg });
      console.log("收到的Blob URL:", msg);
    };
    socketInstance.on("msg-recieve", handleMsgReceive);

    // 组件卸载时移除监听,避免内存泄漏
    return () => {
      socketInstance.off("msg-recieve", handleMsgReceive);
    };
  }
  setNoImage(false);
}, []);

在img标签中使用

假设arrivalMessage.message存储的是Blob URL,直接绑定到src:

{arrivalMessage?.message && (
  <img src={arrivalMessage.message} alt="接收的图片" />
)}

额外注意事项

如果之后你需要处理原始二进制Blob数据(比如服务器直接发二进制流),才需要用new Blob()和URL.createObjectURL(),但这种情况要记得在组件卸载或不再使用图片时,调用URL.revokeObjectURL()释放内存,避免内存泄漏:

// 示例:处理二进制数据的情况
const RecieveBlob = new Blob([binaryMsg], { type: 'image/jpeg' });
const RecieveImageURL = URL.createObjectURL(RecieveBlob);
// ...使用URL后,记得在合适时机清理
URL.revokeObjectURL(RecieveImageURL);

内容的提问来源于stack exchange,提问作者unni krishnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:05:25