Postgresql 使用Coldfusion从Postgres存储和检索图像
我正在将数据库从mssql express 2005迁移到postgresql 9.0。 在mssql中,列是图像类型,而在postgresql中,我使用的是bytea类型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
<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解决方案,但如果这是一个页面请求时调用的内容,那么您就是在自找麻烦。