使用Coldfusion存储和检索Postgres中的图像

时间:2010-11-25 15:37:58

标签: postgresql coldfusion

我正在将数据库从mssql express 2005迁移到postgresql 9.0。 在mssql中,列是图像类型,在postgresql中,我使用的是bytea类型。

<cffile 
       action="readbinary" 
       file="#ExpandPath('./uploads/')##theLogo.SERVERFILE#" 
       variable="myLogo">

<cfquery 
        name="saveLogo" 
        datasource="#SESSION.DSN#">
        UPDATE bright.group SET LOGO =  <cfqueryparam  
                                                       cfsqltype="cf_sql_blob"                    
                                                       value="#myLogo#">        
</cfquery>

上面的代码片段似乎在我保存时有效,但当我尝试使用下面的代码段显示图片时,我什么都没得到。

<cfquery 
       datasource="#SESSION.dsn#" 
       name="image">
        SELECT LOGO
        FROM bright.group
        WHERE groupid=#URL.groupid#
</cfquery>
<cfcontent variable="#image.LOGO#" type="image/png">

这适用于mssql但不适用于postgres。

非常感谢任何帮助/方向。 感谢

2 个答案:

答案 0 :(得分:2)

您能否进行适当的重构并放弃在数据库中保存图像?

将文件系统用于二进制文件和数据库,以保留这些资源的路径。它将加快您的应用程序并使未来的迁移变得更加容易。

答案 1 :(得分:1)

不太了解真正的机制,但这是我发现的。 图像以不同方式存储。我在十六进制查看器中打开了返回的图像。 postgresql文本匹配从第2个字节到结尾的mssql十六进制值。

我尝试了将postgresql输出转换为无效的所有内容。第一个字节不同并没有帮助。 最后,我将数据类型从bytea更改为text,并保存了编码的二进制文件。

<cffile action="readbinary" file="#ExpandPath('./logo.png')#" variable="myLogo">
<cfquery name="saveLogo" datasource="#session.dsn#">
        UPDATE bright.group SET LOGO = 
        (<cfqueryparam value="#BinaryEncode(myLogo,'hex')#" cfsqltype='cf_sql_longvarchar'> )
    </cfquery>

<cfquery datasource="#session.dsn#" name="qryGetLogo">
        SELECT logo
        FROM bright.group
        WHERE groupid=#groupid#
    </cfquery>

    <cfcontent  type="image/png" variable="#BinaryDecode(qryGetLogo.logo,'hex')#">

希望有人觉得这很有帮助。