Использование Coldfusion для хранения и получения изображения из Postgres - PullRequest
1 голос
/ 25 ноября 2010

Я нахожусь в процессе миграции базы данных с 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 ]

2 голосов
/ 25 ноября 2010

Не могли бы вы сделать правильный рефакторинг и отказаться от сохранения изображений в базе данных?

Используйте файловую систему для двоичных файлов и базу данных, чтобы сохранить пути к этим ресурсам. Это ускорит ваше приложение и облегчит любую будущую миграцию.

1 голос
/ 26 ноября 2010

Не знаю много, чтобы объяснить настоящую механику, но это то, что я узнал.Изображение сохраняется по-другому.Я открыл возвращенные изображения в программе просмотра в шестнадцатеричном формате.Текст postgresql соответствовал шестнадцатеричным значениям mssql от 2-го байта до конца.

Я пытался все, чтобы преобразовать вывод postgresql безрезультатно.Не помогло, что первый байт был другим.В конце я изменил тип данных с bytea на текстовый и вместо этого сохранил закодированный двоичный файл.

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

Надеюсь, кто-то найдет это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...