如何在Heroku Postgres中插入图片?插入时报错列不存在如何解决
问题根源
- 第一个错误是PostgreSQL语法规则使用错误:PostgreSQL中双引号
""用来引用数据库标识符(表名、列名等),字符串值需要用单引号''包裹。你把文件路径用双引号包裹后,PostgreSQL会将路径内容识别为列名去匹配,自然报「列不存在」的错误。 - 第二个错误是SQL注入风险:直接拼接用户可控的文件名称到SQL语句中,很容易被注入攻击。
- 第三个逻辑问题:你当前试图把本地文件路径转bytea存入数据库,既不符合bytea字段的设计用途,而且Heroku的临时文件系统不会持久保存你上传的文件,就算你存了路径后续也访问不到文件。
修复步骤
- 改用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("/") })
- 额外注意:如果你的图片体积较大,不建议直接存在PostgreSQL中,Heroku的PostgreSQL有存储容量限制,超过会额外收费,也可以选择将图片上传到对象存储服务,只在数据库中存图片的访问链接即可。
内容的提问来源于stack exchange,提问作者UltimateSheepConfusedAtCode
相关产品推荐
相关产品推荐

