怎样读取数据库中存储的二进制图片文件

怎样读取数据库中存储的二进制图片文件,第1张

下面我们将示例一个图片文件读取存储至数据库并从数据库中读取图片信息并显示的案例:

1、首先读取硬盘上的某一具体图片文件,读取模式设置为readBinary方式:

<cffile

action

=

"readBinary"

file

=

"temp

directory

here#file.serverFile#"

variable

=

"test">

2、将读取出来的二进制内容存储至数据库中(注:数据库字段需设置成能存储图片类型的字段,如blob类型):

<cfquery

datasource

=

"datasource">

insert

into

imageTest

values

(<cfqueryparam

cfsqltype="cf_sql_blob"

value="#test#">)

</cfquery>

通过1、2两个步骤,我们轻松实现了读取图片文件并存储至数据库的 *** 作过程。

3、从数据库中读取图片信息,该文件可命名为dispImage.cfm:

<!---

在此需特别注意enablecfoutputonly的压缩空白功能,如果不对该页面进行空白压缩,很可能会造成图片无法显示的问题

--->

<cfprocessingdirective

suppressWhiteSpace="yes">

<cfsetting

enablecfoutputonly="yes">

<!---

读取相应的图片信息

--->

<cfquery

datasource

=

"datasource">

select

image

from

imageTest

where

variable

here#

</cfquery>

<!---

设置浏览器输出的格式,我们将它设置为图片的JPG类型,用户可根据实际情况改动类型设置

--->

<cfcontent

type="image/jpg">

<!---

输出图片

--->

<cfoutput>#toString(imageTest.image)#</cfoutput>

</cfprocessingdirective>

<cfabort>

4、显示图片内容,调用dispImage.cfm页面:

<img

src

=

"dispImage.cfm?id=your

variable

here">

通过3、4两个步骤,我们也很容易的就完成了从数据库中读取图片信息并在页面显示的功能。

总结:实际上,除了图片文件可以如此处理,其它的文件也能通过类似方式进行处理,可将任意文件类型存储至数据库,只是文件大小的原因以及数据库存储读取速度性能限制,我们基本上还是不建议将文件存储至数据库,毕竟硬盘读取要快得多。

用ADO方式连的MYSQL, 已经用AppendChunk图片以二进制插入数据库中,下面是读取的不分,写入相反的方式

void DatabaseFile::GetImage()

{

_RecordsetPtr pRs = NULL

pRs.CreateInstance(__uuidof(Recordset))

_variant_t varChunk

_variant_t varBLOB

try

{

CString sql = "select image from visdata where DetectTime = '2008-06-19 11:23:44'"

//Open a Recordset

HRESULT hr = pRs->Open(_variant_t("select * from visdata"),_variant_t((IDispatch *) m_pConnection,true),adOpenKeyset,adLockOptimistic,adCmdText)

//read data

long lDataLength = pRs->Fields->GetItem("image")->ActualSize//数据长度可以正确获取

varBLOB = pRs->GetFields()->GetItem("image")->GetChunk(lDataLength)

if(varBLOB.vt == (VT_ARRAY | VT_UI1))

{

BYTE *pBuf = NULL

pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,lDataLength)//分配空间

hr = SafeArrayAccessData(varBLOB.parray,(void **)&pBuf)

if (FAILED(hr))

return

//Build a File

char tmpPath[_MAX_PATH+1]

GetCurrentDirectory( MAX_PATH,tmpPath)

CString strFileName = "\\temp2.bmp"//输出图片的文件名

strFileName = tmpPath+strFileName

CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary )

/*要判断文件是否创建成功*/

LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)(pBuf))

outFile.WriteHuge(buffer,lDataLength)

GlobalUnlock((HGLOBAL)pBuf)

outFile.Close()

SafeArrayUnaccessData (varBLOB.parray)

}

pRs->Close()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9676382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存