Postgresql 使用Coldfusion从Postgres存储和检索图像

Postgresql 使用Coldfusion从Postgres存储和检索图像,postgresql,coldfusion,Postgresql,Coldfusion,我正在将数据库从mssql express 2005迁移到postgresql 9.0。 在mssql中,列是图像类型,而在postgresql中,我使用的是bytea类型 <cffile action="readbinary" file="#ExpandPath('./uploads/')##theLogo.SERVERFILE#" variable="myLogo"> <cfquery name="save

我正在将数据库从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

任何帮助/指导都将不胜感激。
谢谢

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


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

我不知道如何解释真正的机制,但这就是我发现的。 图像的存储方式不同。我在一个十六进制查看器中打开返回的图像。postgresql文本从第二个字节到最后匹配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')#">

希望有人觉得这有帮助。

好的观点,鲍里斯。除此之外,我已经将所有二进制文件移动到amazon的S3。它从许多不同的地方被调用,需要很长时间才能全部更改。+1因为我处理过在数据库中存储二进制文件的系统,这是一个显著的扩展瓶颈。与关系数据库相比,文件系统更擅长处理这一问题。文件系统中有+1个文件,数据库中有数据。是的,我意识到文件是二进制数据;检查postgres数据源的cf数据源设置,查看是否为该数据源激活了-启用二进制大对象检索BLOB如果postgres数据源有该选项,我从未使用过oneAntony,但没有帮助。您已经找到了在数据库中存储二进制数据的正确ColdFusion解决方案,但如果这是一个页面请求时调用的内容,那么您就是在自找麻烦。