如何在反应中显示base64图像?

Posted

技术标签:

【中文标题】如何在反应中显示base64图像?【英文标题】:How to show base64 image in react? 【发布时间】:2019-11-08 04:18:15 【问题描述】:

我将图像以 base64 格式存储在节点中。然后我收到它并存储在一个变量中。并将其显示在标签中,但未显示。从服务器接收正确的值。在渲染中,如果设置了状态,则函数条件为真。即使它为真,它也不会显示。

getImage() 
    console.log('getImage');
    axios.get(`http://localhost:4000/image/get`).then((result) => 
        this.setState( image: result )
        console.log(result);
    );


render()
    this.state.image ? <img src=this.state.image></img>: ''

我得到了我存储在服务器中的精确 base64 字符串。它返回

<img src="[object Object]">

在 DOM 中。我不知道我哪里出错了

编辑

router.route('/image/get').get((req, res) => 
    console.log('inside img get');
    Image.find((err, result) => 
        if (err) 
            res.json( "error": true, "message": "error fetching data" );
         else 
            // console.log(result);
            res.json(result);
        
    )

);

型号

const mongoose=require('mongoose');
const Schema=mongoose.Schema;
var ImageSchema=new Schema(
    imageName:
        type:String
    ,
    imageData:
        type:String
    

);

export default mongoose.model('Image', ImageSchema);

【问题讨论】:

【参考方案1】:

您是否确保在 src 属性中添加编码类型以及 base64 编码值?

render()
    this.state.image ? <img src=`data:image/png;base64,$this.state.image`/>: ''

【讨论】:

试过了。什么都没有出现。它返回 。 this.state.image 中的值为“data:image/png;base64,iVBORw0KGgoAAAAN.......” @Krazy 实际图像的 src 可能嵌套在响应 object【参考方案2】:
const byteCharacters = atob(result);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) 
    byteNumbers[i] = byteCharacters.charCodeAt(i);

const byteArray = new Uint8Array(byteNumbers);

let image = new Blob([byteArray],  type: 'image/jpeg' );

一旦你有了 Blob,你需要将它转换成这样的数据 url:

let imageUrl = URL.createObjectURL(image);
this.setState(image: imageUrl);

现在您可以使用保存在您所在州的这个网址作为图像的来源,如下所示:

<img src=this.state.image />

希望这会有所帮助!

【讨论】:

不工作。我正在从服务器获取准确的 base64 字符串。 @Karthi 我已经编辑了答案。试试看,让我知道。还要检查我用来创建 blob 的内容类型是否适用于 jpeg 图像。您可以使用 png 或 jpg 而不是 jpeg 来适应您的情况。 返回错误:在'Window'上执行'atob'失败:要解码的字符串没有正确编码。 你能给我你的api来返回这个结果吗? 我认为您从后端发送的文件可能存在问题。【参考方案3】:

当您收到此错误时:

<img src="[object Object]">

这意味着您向 src 插入一个对象而不是一个字符串。 我的猜测是您的响应返回一个对象而不是字符串

 axios.get(`http://localhost:4000/image/get`).then((result) => 
        this.setState( image: result )
        console.log(result);
    );

检查结果是否为对象

【讨论】:

【参考方案4】:

matias bustos 给出的答案只是你需要像这样将heightwidth 添加到图像标签中才能正常工作:

render()
   this.state.image ? 
      <img width='500' height='200' src=`data:image/png;base64,$this.state.image`/>: 
   ''

【讨论】:

【参考方案5】:

您不能直接将 base64 字符串附加到图像源。首先,您必须使用 Buffer 对其进行解码,然后将该数据附加到 src 中。

像这样试试。

decodeBase64(base64data) 
    let base64ToString = Buffer.from(base64data, "base64").toString()
    this.setState(data: base64ToString )


render() 
    return (
       <img src="data:image/jpeg;base64," + this.state.data />
    )

base64data是base64格式的数据。

【讨论】:

以上是关于如何在反应中显示base64图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Js 中显示 base64 图像?

如何使用 AFNetworking 在 UIImageView 中显示 base64 图像?

如何在 Angular 6 中显示以 base64 格式编码的图像?

如何在本机反应中制作javascript图像blob对象?

如何在浏览器上显示 Base64 图像

如何将 blob 图像转换为 base64? base64 变量显示为空