$resource = pg_connect('host=localhost port=5432 dbname=website user=super password=************');
// grab all the user IDs
$userResponse = pg_query('select distinct(r.id) from resource r
join connection c on r.id = c.resource_id_from
join resource rfile on c.resource_id_to = rfile.id and rfile.resource_type_id = 10
join file f on rfile.id = f.resource_id
join file_type ft on f.file_type_id = ft.id
where r.resource_type_id = 38');
// need to work through one by one to handle data
while($user = pg_fetch_array($userResponse)){
$user_id = $user['id'];
$query = 'select r.id, f.data, rfile.resource_type_id, ft.extension from resource r
join connection c on r.id = c.resource_id_from
join resource rfile on c.resource_id_to = rfile.id and rfile.resource_type_id = 10
join file f on rfile.id = f.resource_id
join file_type ft on f.file_type_id = ft.id
where r.resource_type_id = 38 and r.id = ' . $user_id;
$fileResponse = pg_query($query);
$fileData = pg_fetch_array($fileResponse);
$data = pg_unescape_bytea($fileData['data']);
$extension = $fileData['extension'];
$fileId = $fileData['id'];
$filename = $fileId . '.' . $extension;
$fileHandle = fopen($filename, 'w');
fwrite($fileHandle, $data);
fclose($fileHandle);
}
DO $$
DECLARE
l_lob_id OID;
r record; BEGIN
for r in
select data, filename from bytea_table
LOOP
l_lob_id:=lo_from_bytea(0,r.data);
PERFORM lo_export(l_lob_id,'/home/...'||r.filename);
PERFORM lo_unlink(l_lob_id);
END LOOP;
END; $$
9条答案
按热度按时间6ovsh4lw1#
一个简单的选择是使用
COPY
命令和encode
转换为十六进制格式,然后应用xxd
shell命令(使用-p continuous hexdump style 开关)。例如,假设我在示例表的bytea列中有jpg图像:字符串
正如我所检查的,它在实践中起作用。
i7uq4tfw2#
试试这个:
字符串
hivapdat3#
这是我能想到的最简单的方法
字符串
-qAt
很重要,因为它去除了输出的任何格式。这些选项也可以在psql
shell中使用。doinxwow4#
base64
字符串
xxd
型
ulydmbyx5#
如果你有很多数据要下载,那么你可以先获取行,然后遍历每一行,将bytea字段写入文件。
字符串
vyu0f0g16#
字符串
ao218c7q7#
如果你想从本地Windows而不是从服务器执行此操作,则必须单独运行每个语句,并设置PGAdmin和certutil:
1.安装PGAdmin。
1.从运行时文件夹或cd“C:\Program Files\pgAdmin 4\v6\runtime”打开cmd
1.在PGAdmin查询中运行以获取您必须粘贴到cmd中的每个语句:
SELECT 'set PGPASSWORD={PASSWORD} && psql -h {host} -U {user} -d {db name} -Aqt -c“SELECT encode({bytea_column},''base64 '')FROM {table} WHERE id='|| ID|| '”> %a% && CERTUTIL -decode %a%“C:\temp{name_of_the_folder}\FileName - '||联系我们||'('|| TO_CHAR(current_timestamp(),'DD. MM. YYYY,HH24 MI SS ')||').'||联系我们||'"' FROM table WHERE ....;
它将生成如下内容:
字符串
1.将生成的所有语句复制粘贴到CMD中。文件将保存到本地计算机。
nzk0hqpo8#
据我所知,bytea to file需要在应用程序级别完成。
(9.1可能会用文件系统数据 Package 器contrib改变这一点。还有一个lo_export函数,但它在这里不适用。)
iqih9akk9#
您可以使用pgsql-fio扩展来实现此功能。
字符串