如何将虚拟机PostgreSQL数据库中的图片显示到本地?黑屏问题求助
解决Odoo ir_attachment图片显示黑屏的问题
你踩了一个典型的Odoo文件存储误区——store_fname字段根本不是存二进制图片数据的,它只是记录了图片在Odoo文件系统里的存储路径,所以你用pg_unescape_bytea()去处理它,自然只会输出一堆无效内容,导致浏览器显示黑屏。
下面给你一步步修正的方案:
核心问题说明
Odoo的ir_attachment表有两种存储方式:
- 当
store_fname有值时:文件存在Odoo的本地文件系统(filestore)里,store_fname是相对路径 - 当
store_fname为空时:二进制数据才存在datas字段(bytea类型)里,这时候才需要用pg_unescape_bytea()处理
你的场景显然是第一种,所以得去读取对应路径的文件,而不是操作数据库字段的内容。
修正后的PHP代码
<?php // 1. 建立数据库连接 $conn = pg_connect("user = admin password = admin host = 192.168.1.11 dbname = odoo"); if (!$conn) { die("数据库连接失败: " . pg_last_error()); } // 2. 查询目标附件的存储路径 $res = pg_query($conn, "SELECT store_fname FROM ir_attachment WHERE res_model = 'res.partner' AND res_field = 'image' AND res_id = 3;"); if (!$res) { die("查询失败: " . pg_last_error()); } $store_fname = pg_fetch_result($res, 'store_fname'); pg_close($conn); // 3. 配置Odoo的filestore根路径(替换成你实际的路径) // 示例路径:Ubuntu系统Odoo默认安装的路径 $filestore_root = '/var/lib/odoo/.local/share/Odoo/filestore/odoo/'; // 拼接完整的图片路径(store_fname格式是ab/abcdef0123456789,直接拼接即可) $full_image_path = $filestore_root . $store_fname; // 4. 读取并输出图片 if (file_exists($full_image_path)) { // 动态获取图片的MIME类型,避免硬写jpeg不兼容png等格式 $mime_type = mime_content_type($full_image_path); header("Content-Type: $mime_type"); // 直接输出文件内容 readfile($full_image_path); } else { // 文件不存在时的错误处理 header("HTTP/1.0 404 Not Found"); echo "图片文件不存在,请检查路径或记录是否正确"; } ?>
关键注意事项
确认filestore路径:
- 你可以在Odoo的配置文件(
odoo.conf)里找到data_dir配置项,filestore就在这个目录下的filestore/[你的数据库名]/文件夹里 - 如果是源码安装,默认路径可能是
odoo/filestore/[数据库名]/,根据你的实际部署调整
- 你可以在Odoo的配置文件(
权限问题:
- 运行PHP的用户(比如Apache的
www-data、Nginx的nginx)需要有读取Odoo filestore目录的权限,否则会因权限不足无法读取文件,依然显示黑屏
- 运行PHP的用户(比如Apache的
MIME类型适配:
- 不要硬写
image/jpeg,因为Odoo里的图片可能是PNG、WEBP等格式,用mime_content_type()动态获取更稳妥
- 不要硬写
内容的提问来源于stack exchange,提问作者houssam
相关产品推荐
相关产品推荐

