PostgreSQL插入图片时提示文件不存在错误该如何解决?
报错原因
- 路径格式错误:Windows系统绝对路径盘符后缺失冒号,你写的
C/Program Files/...不符合Windows路径规范,正确格式应为C:/Program Files/...。 - 文件实际不存在/路径不匹配:确认目标图片确实存放在你写的路径下,文件名拼写、大小写完全匹配。
- 函数权限与范围限制:
pg_read_file是服务器端函数,仅允许读取PostgreSQL服务进程可访问的文件,默认仅支持读取数据库数据目录内的文件,且运行PostgreSQL服务的系统用户(默认是postgres)需要对目标文件有读取权限。如果是远程连接数据库,该函数无法读取你本地设备上的文件。
解决方法
方法1:修正配置后直接用pg_read_file(仅适用本地操作、文件存放在数据目录的场景)
- 修正文件路径为
C:/Program Files/PostgreSQL/14/data/ADC.jpeg - 确认
ADC.jpeg确实放在上述数据目录中,且PostgreSQL服务运行用户对该文件有读取权限 - 执行修正后的SQL:
insert into books(book_pic) values(pg_read_file('C:/Program Files/PostgreSQL/14/data/ADC.jpeg')::bytea);
方法2:通过psql客户端导入(通用场景,无需调整服务器权限)
使用psql的大对象导入功能实现本地文件插入,无需调整服务器文件权限:
- 在psql命令行执行导入命令,会返回一个临时大对象的OID:
\lo_import 'C:/Program Files/PostgreSQL/14/data/ADC.jpeg'
- 假设返回的OID为16389,执行插入语句:
insert into books(book_pic) values(lo_get(16389));
- 插入完成后清理临时大对象:
select lo_unlink(16389);
方法3:业务代码插入(生产环境推荐)
在应用代码中读取图片文件转成二进制流,绑定到SQL的bytea类型参数插入即可,无需依赖数据库的文件读取权限,兼容性和安全性更高。
内容的提问来源于stack exchange,提问作者Srinath Raghavan
相关产品推荐
相关产品推荐

