JHipster-Liquibase:如何上传图片文件Blob至PostgreSQL?
如何将本地图片上传至PostgreSQL的longblob类型列
首先得提一句:PostgreSQL本身并没有longblob这个类型,你这里的表定义应该是兼容其他数据库的写法,实际在PostgreSQL里会被映射成bytea类型(用来存储二进制数据)。如果是超大文件,也可以用PostgreSQL的大对象(Large Object)机制,不过我们先从最常用的场景说起。
下面给你两种靠谱的实现方式,按需选择:
方法一:用PostgreSQL命令行(psql)直接上传
如果你习惯用命令行操作,这种方式适合快速测试:
前置准备
- 先确认图片文件(比如
MyImage.jpeg)的位置:如果用pg_read_file函数,文件得在数据库服务器的本地路径下;如果用\lo_import,可以是你本地机器的文件(只要能通过psql连接到数据库)。 - 记好图片的MIME类型:jpeg文件对应
image/jpeg,png是image/png,这个要填到image_content_type列里,方便后续识别图片格式。
具体操作
方式A:用pg_read_file(服务器本地文件)
这个方法需要超级用户权限,直接读取服务器上的文件插入:
INSERT INTO your_table_name (image, image_content_type) VALUES (pg_read_file('/绝对路径/MyImage.jpeg'), 'image/jpeg');
方式B:用\lo_import(本地文件)
先通过psql把本地文件导入成PostgreSQL的大对象,会返回一个OID(比如12345):
\lo_import '/你本地的路径/MyImage.jpeg'
然后用这个OID获取二进制数据插入表中:
INSERT INTO your_table_name (image, image_content_type) VALUES (lo_get(12345), 'image/jpeg');
如果不需要保留这个大对象,插入后可以删掉:
\lo_unlink 12345
方法二:用编程语言上传(以Python为例)
这是实际项目里最常用的方式,通过代码读取本地文件并插入数据库:
第一步:安装依赖
先装PostgreSQL的Python驱动psycopg2:
pip install psycopg2-binary
第二步:编写代码
把下面的占位符替换成你自己的数据库信息和文件路径就行:
import psycopg2 from mimetypes import guess_type # 数据库连接配置,换成你自己的 db_config = { "dbname": "你的数据库名", "user": "你的用户名", "password": "你的密码", "host": "数据库地址" } # 本地图片的路径 image_file = "MyImage.jpeg" # 自动识别图片的MIME类型 mime_type, _ = guess_type(image_file) # 如果识别不出来,用默认的二进制类型 if not mime_type: mime_type = 'application/octet-stream' # 读取图片的二进制数据 with open(image_file, 'rb') as f: image_bytes = f.read() # 插入数据到数据库 try: with psycopg2.connect(**db_config) as conn: with conn.cursor() as cursor: insert_sql = """ INSERT INTO your_table_name (image, image_content_type) VALUES (%s, %s); """ cursor.execute(insert_sql, (image_bytes, mime_type)) conn.commit() print("图片上传成功啦!") except Exception as e: print(f"上传出错了:{str(e)}")
几个重要提醒
- 一定要把代码里的
your_table_name换成你实际的表名,数据库参数也得对应上。 image_content_type别乱填,正确的MIME类型能让后续读取图片时正常解析。- 如果你的图片特别大(比如超过1GB),建议用PostgreSQL的大对象(Large Object)来存储,
bytea更适合中等大小的二进制数据。
内容的提问来源于stack exchange,提问作者1Z10
相关产品推荐
相关产品推荐

