在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;
}
}
}   

解决方案 »

  1.   

    招聘VC++,C# 各数人。 
    至少一年以上经验,能够独立胜任工作 
    熟悉MFC,VC的各种类的用法 
    有B/S开发经验尤佳 
    薪水:面议,年收入保底6万(带薪年假,年底双薪) 
    邮箱:[email protected]  363356039(注明:应聘) 
    请把简历发送到邮箱,合则约见(考虑各位在职,时间周末) 来挑战吧!!北京石景山  
      

  2.   

    吧图像写成文件保存起来,。然后读文件//导出人员照片,photoname为完整的图片路径加上名称
    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;
    }
      

  3.   

    photoname为完整的图片路径加上名称   photo是数据库中存储图片的字段
      

  4.   

    解决了原来是用cout.write(buffer,size);函数见帖 http://topic.csdn.net/u/20071204/09/acba8411-439a-4c1c-b283-cb5324f17027.html但是不明白为啥 cout<<buffer 这种不行呢?