vc 中如何用POST方法发送xml 文件到Web服务器,就象IE页面中提交文件到服务器(服务器页面接收)

解决方案 »

  1.   

    就是文件上传,不管是否XML文件。用http post方法
      

  2.   

    发下是我的一段代码,你可以看一下。         nRet = nProxyV(bsURL,bIsGet,vtPostData,bsHeader,lStatus,vtResponse,bsResponse); int nWtbsSetRequestHeader( MSXML2::IServerXMLHTTPRequestPtr httpServer,
      _bstr_t bsHeader ) // , int nContentLen )
    {
    CString strHeader, strItem, strName, strValue;
    int nLen, nStt, nEnd, nCur, nFindN, nFindR, nFindC;
    // char lcaTmp[ 32 ];
    HRESULT hrRet;// 0. Trap
    if( 0 == bsHeader.length() )
    return 0; if( NULL == httpServer )
    return -1;// 1. Init
    strHeader = (char*)bsHeader;
    strItem = "";
    strName = "";
    strValue = "";
    nLen = strHeader.GetLength();
    nStt = 0;
    nEnd = 0;
    nCur = 0;// 2. Work
    for( ; nCur >= 0 && nCur < (nLen-1); )
    {
    nStt = nCur;
    nFindN = strHeader.Find( "\n", nCur );
    nFindR = strHeader.Find( "\r", nCur );
    nFindC = strHeader.Find( ":", nCur );
    if( nFindN < 0 || nFindR < 0 || nFindC < 0  )
    break; // 如果有一个没有找到,没有项目了
    if( abs(nFindN-nFindR) != 1 || nFindC >= min(nFindN,nFindR) )
    { // 如果'\n'和'\r'没有相邻,并且':'在其中一个之后,非法
    nCur = max( nFindN, nFindR ) + 1;
    continue;
    } // 得到Segment/Item的结束位置, max('\n','\r')
    // 在后继的操作操作中,被调用
    nEnd = max( nFindN, nFindR ); // 得到一个Segment/Item: "ItemName:ItemValue"
    // 得到ItemName, ItemValue
    strItem = strHeader.Mid( nCur, (nEnd-nCur-1) );
    strName = strHeader.Mid( nCur, (nFindC-nCur) );
    strValue= strHeader.Mid( nFindC+1, nEnd-(nFindC+1)-1 ); // 移动当前指针,在后继的操作中,不能再使用nCur!!!
    nCur = nEnd + 1; // setRequestHeader
    if( !stricmp("Content-Length",(char*)(LPCTSTR)strName) )
    { // Content-Length
    continue;
    }
    CString temp = strValue;
    temp.TrimRight();
    if( temp.GetLength() == 0 )
    { // 如果strValue为空串,那么不setRequestHeader()
    continue;
    } hrRet = httpServer->setRequestHeader( _bstr_t(strName), _bstr_t(strValue) );
    if( FAILED(hrRet) )
    return -9; // continue
    continue;
    } // end of for()_Loop// 3. Return
    return 0;
    } // end of nWtbsSetRequestHeader()
    #define MClsIDHttpReqPtr L"{afb40ffd-b609-40a3-9828-f88bbe11e4e3}"int nProxyV( _bstr_t bsURL, BOOL bIsGet, const _variant_t & varBody, 
    _bstr_t & bsHeader, long & lStatus, _variant_t & varResponse,_bstr_t &bsResponse )
    {
    int nRet; HRESULT hrRet;
    _bstr_t bsTest, bsSend, bsRecv;
    MSXML2::IServerXMLHTTPRequestPtr httpServer; nRet = MacSuccess;// 1. Work
    try{
    httpServer.CreateInstance( MClsIDHttpReqPtr );
    if( NULL == httpServer ){
    return MacErrOthers;
    } // connect.setTimeouts
    // hrRet = httpServer->setTimeouts( 15000, 5000, 5000, 5000 );
    hrRet = httpServer->setTimeouts(
    2000 * (g_WtbsIni.nHttpTimeOut),
    1000 * g_WtbsIni.nHttpTimeOut,
    1000 * g_WtbsIni.nHttpTimeOut,
    2000 * g_WtbsIni.nHttpTimeOut );
    if( S_OK != hrRet ){
    httpServer.Release();
    return MacErrOthers;
    } // connect.open()
    hrRet = httpServer->open(bIsGet ? (L"GET") : (L"POST"), bsURL, VARIANT_FALSE );
    if( S_OK != hrRet ){
    httpServer.Release();
    return MacErrIOpen;
    } // send Header
    hrRet = nWtbsSetRequestHeader( httpServer, bsHeader ); // connect.send()
    if(bIsGet)
    {
    hrRet = httpServer->send();
    }
    else
    {
    hrRet = httpServer->send(varBody);
    }
    if( S_OK != hrRet ){
    httpServer.Release();
    return MacErrSendRqst;
    } // connect.get_responseText
    bsHeader = httpServer->getAllResponseHeaders();
    lStatus = httpServer->status;
    varResponse = httpServer->responseBody;
    bsResponse = httpServer->GetresponseText(); // return
    httpServer.Release();
    return MacSuccess;
    }
    catch (_com_error e)
    {
    httpServer.Release();
    return MacErrCatch;
    }
    catch (...)
    {
    httpServer.Release();
    return MacErrCatch;
    } httpServer.Release();
    return MacSuccess;
    } // end of nProxyV()