在C++中,在网页上输出以文件形式保存的图像,可以用流对象读取一个字节然后输出,那么对于数据库中的图像数据,读取之后,该如何输出,下面段是我的代码,和网上很多其他的类似,只不过别人的是读取后保存成文件。我是想直接网页输出,这个该如何输出呢?貌似直接用 fprintf 等不可以。。需要进行一些转换?
char *strdata;
long lDataSize = pRePtr->GetFields()->GetItem("data")->ActualSize; ///得到数据的长度
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = pRePtr->GetFields()->GetItem("data")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确
{
if(strdata = new char[lDataSize+1]) ///重新分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(strdata,pBuf,lDataSize); ///复制数据到缓冲区m_pBMPBuffer
fprintf(stdout,"Content-Type:image/jpeg;\n\n");
_setmode(_fileno(stdout),_O_BINARY);
wcout<<strdata;
//fprintf(stdout,"%s",strdata);
fflush(stdout) ;
_setmode(_fileno(stdout),_O_TEXT); SafeArrayUnaccessData (varBLOB.parray);
delete []strdata;
strdata = NULL;
}
}
}
char *strdata;
long lDataSize = pRePtr->GetFields()->GetItem("data")->ActualSize; ///得到数据的长度
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = pRePtr->GetFields()->GetItem("data")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确
{
if(strdata = new char[lDataSize+1]) ///重新分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(strdata,pBuf,lDataSize); ///复制数据到缓冲区m_pBMPBuffer
fprintf(stdout,"Content-Type:image/jpeg;\n\n");
_setmode(_fileno(stdout),_O_BINARY);
wcout<<strdata;
//fprintf(stdout,"%s",strdata);
fflush(stdout) ;
_setmode(_fileno(stdout),_O_TEXT); SafeArrayUnaccessData (varBLOB.parray);
delete []strdata;
strdata = NULL;
}
}
}
至少一年以上经验,能够独立胜任工作
熟悉MFC,VC的各种类的用法
有B/S开发经验尤佳
薪水:面议,年收入保底6万(带薪年假,年底双薪)
邮箱:[email protected] 363356039(注明:应聘)
请把简历发送到邮箱,合则约见(考虑各位在职,时间周末) 来挑战吧!!北京石景山
int DBinterface::ExportStaffPhoto(LPCTSTR username,LPCTSTR no,LPCTSTR photoname)
{
if (!m_bDBOpen)
{
return -1;
} char szSQL[SQL_BUFFER_LEN] = {0}; sprintf(szSQL, "SELECT photo FROM Staff_TagInfo WHERE name=\'%s\' AND no=\'%s\'", username, rfidno);
try
{
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(Recordset));
HRESULT hr = rs->Open((LPCTSTR)szSQL,_variant_t((IDispatch *)m_connection,TRUE),adOpenDynamic,adLockPessimistic,adCmdText);
if (FAILED(hr))
{
return -1;
}
long filesize = rs->GetFields()->GetItem("photo")->ActualSize;
if (filesize > 0)
{
HANDLE hFile = CreateFile(photoname,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//int err =GetLastError();
if (hFile == INVALID_HANDLE_VALUE)
{
return -1;
}
_variant_t varBLOB = rs->GetFields()->GetItem("photo")->GetChunk(filesize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
DWORD dwSizeWrite;
WriteFile(hFile, pBuf, filesize, &dwSizeWrite, NULL);
SafeArrayUnaccessData (varBLOB.parray);
}
CloseHandle(hFile);
}
}
catch (_com_error &err)
{
TRACE(_T("数据库操作失败! 错误信息:%s, 文件:%s, 行:%d.\n"), err.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return 0;
}