mysql 将blob(组成图像)更改为图像,并将此图像放入< img>

jhdbpxl9  于 5个月前  发布在  Mysql
关注(0)|答案(2)|浏览(57)

所以.我添加记录到一个数据库(MySQL与XAMPP和“mysql 2”:“^3.6.2”包)通过

export const addPage = async (req,res) => {
        try
        {
            if(req.session.user !== undefined)
            {
                const body = req.body;
                const plik =  req.file.buffer.toString('utf-8'); // REMEMBER THIS
                const link = body.link;
                const tytul = body.tytul;
                const opis = body.opis;
                const user =  req.session.user.substr(-1);
                const curDate = new Date();
                const [re] = await (global.db).query("INSERT INTO sites VALUES (NULL, ?, ?, ?, ?, ?, ?);", [plik, link, tytul, opis, user, curDate]);
                res.redirect("/panel")
                return 0;
            }
            else{res.redirect('/');}
        }
        catch(err)
        {
            throw err; res.redirect('/login');
        }
}

字符串
我想做一个获取所有记录的API。所以我做了

export const getAllPages = async (req,res) => 
{
    try
    {
        var [rows,fields] = await (global.db).query("select * from sites order by creation_date");
        var image_array = [];

        rows.forEach(element => {
            image_array.push(element.icon.toString('base64'))
        });

       res.status(201).json({
            status:"success",
            Length: rows.length,
            data: rows,
            images: image_array
        });
    }
    catch(err)
    {
        res.status(401).json({
                status:"fail",
                message: err.message
        }) 
    }
}


注意事项:(global.db)id变量,用于保持与数据库的连接,它工作得很好,没有问题。但是我有一个对象,由状态,数据长度,数据本身(由数据库中的记录组成)和图像组成,图像由blob数组转换成base64字符串。
在我的js文件在前端我有:

const PagesData = fetch("http://localhost:3000/api/v1/Pages", { method:"GET"}) 
    .then((r) => r.json())
    .then((Data) => {
        console.log(Data);
        for (let i = 0 ; i < Data.Length; i++)
        { 
            let element = Data.data[i]
            console.log(element)

            document.getElementsByTagName('main')[0].innerHTML+=
            `
                    <a class="window octagon-border" href="sitedetails/${element.id}">
                        <div class="window-img">
                            <img id="${i}"/>
                        </div>
                        <div class="window-title">
                            <div class="btn inverted-colors no-hover">${element.title}</div>
                        </div>
                        <div class="window-mask hexagon"></div>
                    </a>
            `
        };   
        for(let i = 0; i< Data.Length; i++)
        {
            document.getElementById(i).src = Data.images[i];
        }     
    })
    .catch((e) =>  console.log(e));


我得到的结果是,在img标签中,我得到src="”,其中有一个长字符串(它有字符,而不仅仅是数字,因此转换为字符串('base64')工作)。问题是,它不显示结果(它不显示和图像,但在浏览器中有一个图标,没有这样的文件)。
有可能是一个问题,到数据库我把utf-8转换,当从数据库中获取数据时,我使用base64,但当进入数据库时,我使用base64,然后它不工作。
我想从斑点图像,然后显示在img标签
我用的是node v20.5.1

sc4hvdpw

sc4hvdpw1#

作者在这里。我是对的,编码是一个问题。我所做的更改
发件人:

const plik = req.file.buffer.toString('utf-8');

字符串
收件人:

const plik =  req.file.buffer;


在前端,
发件人:

document.getElementById(i).src = Data.images[i];


收件人:

document.getElementById(i).src = "data:image/png;base64,"+Data.images[i];

bfrts1fy

bfrts1fy2#

我不完全理解DB部分,但关于前端的blob:

  • 在您期望blob的部分,返回响应为response.blob()而不是response.json()。基本上,尝试以下操作:
return response.blob().then(result =>{
  const img = URL.createObjectURL(result)
  const myImgTag = document.querySelector(".my-img-tag")
  myImgTag.src = img
})

字符串

相关问题