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

如何在Heroku Postgres中插入图片?插入时报错列不存在如何解决

问题根源

  • 第一个错误是PostgreSQL语法规则使用错误:PostgreSQL中双引号""用来引用数据库标识符(表名、列名等),字符串值需要用单引号''包裹。你把文件路径用双引号包裹后,PostgreSQL会将路径内容识别为列名去匹配,自然报「列不存在」的错误。
  • 第二个错误是SQL注入风险:直接拼接用户可控的文件名称到SQL语句中,很容易被注入攻击。
  • 第三个逻辑问题:你当前试图把本地文件路径转bytea存入数据库,既不符合bytea字段的设计用途,而且Heroku的临时文件系统不会持久保存你上传的文件,就算你存了路径后续也访问不到文件。

修复步骤

  1. 改用PostgreSQL参数化查询,不要手动拼接SQL,同时读取文件的二进制内容存入bytea字段,示例代码如下:
const fs = require('fs/promises')

app.post("/create-post", upload.single("file"), async (req, res) => {
    const content = req.body.Content;
    // 先读取上传文件的二进制内容
    const fileContent = await fs.readFile(req.file.path);
    try {
        // 用参数化查询,$1 $2 $3是占位符,按顺序传参数即可
        await client.query(
            `INSERT INTO a_image(data, image, name) VALUES($1, $2, $3)`,
            [fileContent, req.file.filename, req.file.originalname]
        )
        // 插入成功后可以删掉本地临时文件,避免占用Heroku临时空间
        await fs.unlink(req.file.path)
    } catch (err) {
        console.error('插入失败:', err)
    } finally {
        client.end();
    }

    const newMember = await Posts.create({
        Owner: req.user.Username,
        Body: req.body.Content,
        Image: req.file
    })

    return res.redirect("/")
})
  1. 额外注意:如果你的图片体积较大,不建议直接存在PostgreSQL中,Heroku的PostgreSQL有存储容量限制,超过会额外收费,也可以选择将图片上传到对象存储服务,只在数据库中存图片的访问链接即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:02