2010-11-25 26 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

postgresデータソースのcfデータソース設定をチェックして、そのデータソース用に有効になっているBLOBを有効にします(postgresデータソースにそのオプションがある場合、私はこれを使用しません) – Antony

+0

Antonyしかし助けなかった。 – KobbyPemson

答えて

1

実際のメカニックについて説明することはあまり知られていませんが、これがわかりました。 イメージの格納方法が異なります。返された画像を16進表示で開いた。 postgresqlテキストは、2番目のバイトから最後までのmssql 16進値と一致しました。

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')#"> 

誰かがこの情報を役立ててくれることを願っています。

+0

バイナリデータをデータベースに格納するための適切なColdFusionソリューションを発見しましたが、これが要求に応じて呼び出されるものであれば、ページ。 – orangepips

2

適切なリファクタリングを行い、データベースに画像を保存することを中止できますか?

バイナリファイルにはファイルシステムを、データベースにはこれらのリソースへのパスを保持します。アプリケーションのスピードアップを図り、今後の移行をさらに容易にします。

+1

良い点ボリス。私はすべてのバイナリファイルをamazonのS3に移動しました。それは非常に多くの異なる場所から呼び出され、それらをすべて変更するのにかなり時間がかかります。 – KobbyPemson

+0

+1私はデータベースにバイナリを格納するシステムを扱ってきました。スケーリングのボトルネックが大きくなりました。ファイルシステムはリレーショナルデータベースよりもはるかに優れています。 – orangepips

+0

+1ファイルシステム内のファイル、データベース内のデータ。そして、はい、私はファイルがバイナリデータであることを認識しています...;) –

関連する問題