应用PostgreSQL的bytea字段存读取文件及读取失足题目处理惩罚

    添加时间:2013-5-25 点击量:

      PostgreSQL中的bytea字段类型可以以二进制的情势存储数据,如许做的益处就是可以将底本存储在网站目次下的文件存储到数据库中,坏处就是若是文件过多、过大的话,就会导致数据库的数据量大大增长,备份和恢复的时辰就会浪费多量的时候,并且数据也有可能会失足。小我感觉,在文件量小的景象下,应用这种存储体式格式还是很便利的。


      言归正传,下面介绍一下应用bytea字段存读取文件的具体实现办法。起首是文件存储于存储于bytea字段的办法,首要用到的就是PHP中的pg_escape_bytea办法,代码如下:



    <?php
    
    ¥dbconn = pg_connect(host=localhost dbname=dbname user=user password=password port=port
    OR
    DIE(Could not connect: . pg_last_error());
    ¥fileUrl = iconv(utf-8, gbk, ¥fileUrl);//¥fileName为文件路径地址,汉字可能会乱码,此处处理惩罚一下
    ¥fileContents = file_get_contents¥fileUrl);
    ¥escapeBytea = pg_escape_bytea(¥fileContents);//转义bytea数据类型的二进制字符串
    ¥Str = INSERT INTO tableName(id, contents)
    VALUES(DEFAULT, {
    ¥escapeBytea});
    pg_query(
    ¥dbconn¥Str);
    ?>


       从bytea字段中还原文件用到的是PHP中的pg_unescape_bytea办法,实现代码如下:



    <?php
    
    ¥dbconn = pg_connect(host=localhost dbname=test user=postgres password=123456 port=5432
    OR
    DIE(Could not connect: . pg_last_error());
    ¥Str = SELECT contents
    FROM tableName
    WHERE id =
    . ¥fileId;//¥fileId为文件id
    ¥query = pg_query(¥dbconn¥Str);
    while¥row = pg_fetch_array(¥querynull PGSQL_ASSOC)){
    ¥escapeBytea = ¥row[contents];
    ¥fileContents = pg_unescape_bytea(¥escapeBytea); //获得二进制数据
    file_put_contents¥fileName¥fileContents); //¥fileName为带有后缀名的文件名,如hello.pdf
    }
    ?>


       导出文件后,若是二进制数据转码错误就会呈现文件打不开的现象,比如错误的PDF文件打开时弹失足误如下图:



      这种错误在数据库迁徙时希罕轻易呈现(本人是从PostgreSQL 8.4迁徙到9.1),解决的办法是批改PostgreSQL的设备文件
    postgresql.conf,将bytea_output的输出类型设置为转义类型(escape)输出,即bytea_output = escape(若是前面有#,删除开启设备),如许二进制数据就可以正常解码并输出到文件。 


    博客声明:


      本博客中的所有文章,除题目中注明“转载”字样外,其余所有文章均为本人原创或在查阅材料后总结完成,引用非转载文章时请注明此声明。—— 博客园-pallee


    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: