2010-11-25 63 views
1

我正在將數據庫從mssql express 2005遷移到postgresql 9.0。 在mssql中,列是圖像類型,在postgresql中,我使用的是bytea類型。使用Coldfusion存儲和檢索Postgres的圖像

<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。

任何幫助/方向將不勝感激。 謝謝

+0

檢查你的cf數據源設置爲postgres數據源,看看你是否 - 啓用二進制大對象檢索(BLOB)激活該數據源(如果postgres數據源有這個選項,我從來沒有使用過) – Antony 2010-11-26 01:35:30

+0

Antony嘗試過但沒有幫助。 – KobbyPemson 2010-11-26 14:40:42

回答

1

對解釋真實的力學知之甚少,但這是我發現的。 圖像以不同方式存儲。我用十六進制查看器打開了返回的圖像。 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')#"> 

希望有人認爲這有幫助。

2

你可以做一個適當的重構,並放棄在數據庫中保存圖像?

使用二進制文件和數據庫的文件系統來保留這些資源的路徑。它將加快您的應用程序並使未來的遷移變得更加容易。

+1

好點鮑里斯。除了這個之外,我已經將所有二進制文件移至亞馬遜的S3。它從很多不同的地方被調用,需要相當長的一段時間來改變它們。 – KobbyPemson 2010-11-25 15:50:14