使用 Wininet 使用 post 方法(CGI)将文件上传到 http 表单

发布于 2025-01-04 23:29:07 字数 3632 浏览 5 评论 0原文

BOOL CInternet::UpgradeFirmware(char* sIPAddress, int nPort, char* sRequest, char* sResponse,` char* sUserName, char* sPassword,CString sFileName)
{
    BOOL bReturn = FALSE;
    DWORD dwRet = 0;
    strcpy(sResponse, "");

    CPing ping;
    CPingReply pr;
    if ( ping.Ping(sIPAddress,pr) != SUCCEEDED/*FALSE*/)        //  ping once only
    {
        //can not ping this address, return FALSE
        return FALSE;
    }

    CInternetSession session;
    CHttpConnection* pConnection = NULL;   
    CHttpFile* pFile = NULL;
    CFile file;
    DWORD dwTotalRequestLength;
    int cReadLength;
    DWORD dwChunkLength = 64*1024; 
    void* pBuffer = malloc(dwChunkLength);

    session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 600000); 
    session.SetOption(INTERNET_OPTION_CONNECT_RETRIES,1); 
    session.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 600000);
    session.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 60000);
    try
    {   
        file.Open(sFileName,CFile::modeRead);
        CString strHTTPBoundary = _T("AsCg5y");       
        CString strPreFileData = MakePreFileData(strHTTPBoundary, file.GetFileName(),file.GetLength());
        CString strPostFileData = MakePostFileData(strHTTPBoundary);
        CString strRequestHeaders = MakeRequestHeaders(strHTTPBoundary);
        dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + file.GetLength(); 
        pConnection = session.GetHttpConnection(sIPAddress,0, nPort, sUserName, sPassword); 
        DWORD dwHttpRequestFlags =  
                    INTERNET_FLAG_KEEP_CONNECTION
                    | INTERNET_FLAG_NO_UI
                    | INTERNET_FLAG_NO_COOKIES
                    | INTERNET_FLAG_RESYNCHRONIZE 
                    | INTERNET_FLAG_RELOAD
                    |INTERNET_FLAG_NEED_FILE;

        //////////////////////////////////////////////////////////////////////////////
        ///////CHttpConnection::HTTP_VERB_POST for Upload Method/////////////////////
        pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, sRequest, "HTTP/1.0", 1, NULL, NULL,dwHttpRequestFlags);
        pFile->AddRequestHeaders(strRequestHeaders); 
        pFile->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE );  
        pFile->Write((LPSTR)(LPCTSTR)strPreFileData, strPreFileData.GetLength()); 

        cReadLength = -1; 
        while (cReadLength!=0)
        {
            cReadLength = file.Read(pBuffer, dwChunkLength);
            if (0 != cReadLength)
            {
                pFile->Write(pBuffer,cReadLength);
            }
        }  
        file.Close();
        pFile->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
        pFile->EndRequest(HSR_SYNC);
        //////////////////////////////////////////////////////////////////////// 
        pFile->QueryInfoStatusCode(dwRet); 

        if(dwRet == HTTP_STATUS_OK)
        {
            bReturn = TRUE;
        } 
        else
        {
            bReturn = FALSE; 
        }
    }
    catch(CInternetException* pEx)
    {   
        pEx->Delete();
        pEx = NULL;
        bReturn = TRUE;
    } 
    if(pFile)
    {
        pFile->Close();
        delete pFile;
    }

    if(pConnection)
    {
        pConnection->Close();
        delete pConnection;
    }

    session.Close(); 
    return bReturn;
}

虽然 pFile->Write(pBuffer,cReadLength); 抛出异常并显示以下消息:

ERROR_INTERNET_CONNECTION_ABORTED 12030 与服务器的连接已终止。

我不明白原因。请帮我!

BOOL CInternet::UpgradeFirmware(char* sIPAddress, int nPort, char* sRequest, char* sResponse,` char* sUserName, char* sPassword,CString sFileName)
{
    BOOL bReturn = FALSE;
    DWORD dwRet = 0;
    strcpy(sResponse, "");

    CPing ping;
    CPingReply pr;
    if ( ping.Ping(sIPAddress,pr) != SUCCEEDED/*FALSE*/)        //  ping once only
    {
        //can not ping this address, return FALSE
        return FALSE;
    }

    CInternetSession session;
    CHttpConnection* pConnection = NULL;   
    CHttpFile* pFile = NULL;
    CFile file;
    DWORD dwTotalRequestLength;
    int cReadLength;
    DWORD dwChunkLength = 64*1024; 
    void* pBuffer = malloc(dwChunkLength);

    session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 600000); 
    session.SetOption(INTERNET_OPTION_CONNECT_RETRIES,1); 
    session.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 600000);
    session.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 60000);
    try
    {   
        file.Open(sFileName,CFile::modeRead);
        CString strHTTPBoundary = _T("AsCg5y");       
        CString strPreFileData = MakePreFileData(strHTTPBoundary, file.GetFileName(),file.GetLength());
        CString strPostFileData = MakePostFileData(strHTTPBoundary);
        CString strRequestHeaders = MakeRequestHeaders(strHTTPBoundary);
        dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + file.GetLength(); 
        pConnection = session.GetHttpConnection(sIPAddress,0, nPort, sUserName, sPassword); 
        DWORD dwHttpRequestFlags =  
                    INTERNET_FLAG_KEEP_CONNECTION
                    | INTERNET_FLAG_NO_UI
                    | INTERNET_FLAG_NO_COOKIES
                    | INTERNET_FLAG_RESYNCHRONIZE 
                    | INTERNET_FLAG_RELOAD
                    |INTERNET_FLAG_NEED_FILE;

        //////////////////////////////////////////////////////////////////////////////
        ///////CHttpConnection::HTTP_VERB_POST for Upload Method/////////////////////
        pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, sRequest, "HTTP/1.0", 1, NULL, NULL,dwHttpRequestFlags);
        pFile->AddRequestHeaders(strRequestHeaders); 
        pFile->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE );  
        pFile->Write((LPSTR)(LPCTSTR)strPreFileData, strPreFileData.GetLength()); 

        cReadLength = -1; 
        while (cReadLength!=0)
        {
            cReadLength = file.Read(pBuffer, dwChunkLength);
            if (0 != cReadLength)
            {
                pFile->Write(pBuffer,cReadLength);
            }
        }  
        file.Close();
        pFile->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
        pFile->EndRequest(HSR_SYNC);
        //////////////////////////////////////////////////////////////////////// 
        pFile->QueryInfoStatusCode(dwRet); 

        if(dwRet == HTTP_STATUS_OK)
        {
            bReturn = TRUE;
        } 
        else
        {
            bReturn = FALSE; 
        }
    }
    catch(CInternetException* pEx)
    {   
        pEx->Delete();
        pEx = NULL;
        bReturn = TRUE;
    } 
    if(pFile)
    {
        pFile->Close();
        delete pFile;
    }

    if(pConnection)
    {
        pConnection->Close();
        delete pConnection;
    }

    session.Close(); 
    return bReturn;
}

While pFile->Write(pBuffer,cReadLength); throws an exception with the message:

ERROR_INTERNET_CONNECTION_ABORTED
12030
The connection with the server has been terminated.

I don't understand the cause. Please help me!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文