下载文件的代码已经能够实现,但上传文件测试了快一个小时了也没搞定呢,希望使用过的朋友提供下,谢谢!

解决方案 »

  1.   


    呵呵,,你是不是想看啊,下载文件的核心代码:DWORD WINAPI  CDownLoadDlg::DownloadFileThread(LPVOID lpvoid)
    {
    CDownLoadDlg* pThis = (CDownLoadDlg *)lpvoid;
    if(pThis == NULL) return 0; CInternetSession aInternetSession; //一个会话
    CHttpConnection* pHttpConnection = NULL; //链接
    CHttpFile* pHttpFile = NULL;
    const TCHAR szHeaders[] = _T("Accept: */*\r\nUser-Agent:  Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n"); //协议
    DWORD dwFileStatus;
    BYTE szBuffer[1024];
    DWORD nLen;
    CFile aFile;
    DWORD nSuccess = -1;
    CString strServer;
    INTERNET_PORT nPort;
    CString strObject;
    DWORD dwServiceType;
    DWORD dwDownloadSize = 0;
    CString strLogs; //分解URL
    if(AfxParseURL(pThis->m_strURL, dwServiceType, strServer, strObject, nPort))
    {
    //如果服务类型是HTTP下载
    if(dwServiceType != AFX_INET_SERVICE_HTTP && dwServiceType != AFX_INET_SERVICE_HTTPS)
    {
    //返回成功
    return FALSE;
    }
    } try
    {
    //建立http连接
    char strProxyList[MAX_PATH], strUsername[64], strPassword[64];
    strcpy(strProxyList, "127.0.0.1:808");
    strcpy(strUsername, "fengrongxing");
    strcpy(strPassword, "123456");
    INTERNET_PROXY_INFO proxyinfo;
    proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    proxyinfo.lpszProxy = strProxyList;
    proxyinfo.lpszProxyBypass = NULL;
    aInternetSession.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO)); pHttpConnection = aInternetSession.GetHttpConnection(strServer, nPort);
    //如果失败则线程退出
    if(pHttpConnection != NULL)
    {
    //取得HttpFile对象
    pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,
    strObject,
    NULL,
    1,
    NULL,
    NULL,
    INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);
    //如果失败则线程退出
    if(pHttpFile != NULL)
    {
    pHttpFile->SetOption(INTERNET_OPTION_PROXY_USERNAME, strUsername, strlen(strUsername)+1);
    pHttpFile->SetOption(INTERNET_OPTION_PROXY_PASSWORD, strPassword, strlen(strPassword)+1); //增加请求头,如果失败
    if(pHttpFile->AddRequestHeaders(szHeaders))
    {
    //发送文件请求
    if(pHttpFile->SendRequest())
    {
    //查询文件状态
    if(pHttpFile->QueryInfoStatusCode(dwFileStatus))
    {
    //如果文件状态正常
    if ((dwFileStatus/100)*100 == HTTP_STATUS_OK)
    {
    //打开文件
    if(aFile.Open(pThis->m_strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
    {

    DWORD dwFileLen;
    DWORD dwWordSize = sizeof(dwFileLen);
    pHttpFile->QueryInfo(HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH,
    &dwFileLen,&dwWordSize,NULL);
    pThis->m_ProgressCtrl.SetRange32(0, dwFileLen);
    //接收数据
    nLen = pHttpFile->Read(szBuffer, 1024);
    //接收文件数据每次接收一个块
    while(nLen >0 && !pThis->m_bExist)
    {
    //如果接收到数据
    if(nLen > 0)
    {
    //写入文件
    aFile.Write(szBuffer, nLen); dwDownloadSize += nLen; //SetFileProgress(dwDownloadSize);
    pThis->m_ProgressCtrl.SetPos(dwDownloadSize);
    }
    //接收一个块的数据
    nLen = pHttpFile->Read(szBuffer, 1024);
    }
    //如果接收到数据
    if(nLen > 0)
    {
    //写入文件
    aFile.Write(szBuffer, nLen);
    dwDownloadSize += nLen;
    pThis->m_ProgressCtrl.SetPos(dwDownloadSize);
    }
    else
    {
    DWORD   dw ;
    if (InternetQueryDataAvailable((HINTERNET)(*pHttpFile), &dw, 0, 0) && (dw == 0))
    {
    //设置成功标志
    nSuccess = 0;
    }
    }
    //关闭文件
    aFile.Close(); AfxMessageBox("下载完成");
    }
    }
    }
    }
    }
    //删除http文件对象
    delete pHttpFile;
    }
    //删除http连接对象
    delete pHttpConnection;
    } //关闭http连接
    aInternetSession.Close();
    //返回
    return nSuccess;

    }
    //异常处理
    catch(CInternetException* e)
    {
    TCHAR   szCause[MAX_PATH] = {0};
    //取得错误信息
    e->GetErrorMessage(szCause, MAX_PATH);
    //错误信息写入日志
    TRACE("internet exception:%s\n", szCause);
    //删除异常对象
    e->Delete();
    //删除http文件对象
    if(pHttpFile != NULL ) delete pHttpFile;
    //删除http连接对象
    if(pHttpConnection != NULL) delete pHttpConnection;
    //关闭http连接
    aInternetSession.Close();
    //返回
    return -1;
    }
    }
      

  2.   

    不清楚具体写文件这块代码应该怎么写,
    我的代码:
    if(pHttpFile->AddRequestHeaders(szHeaders))
    {
    //发送文件请求
    //pHttpFile->SendRequestEx(strRequest.GetLength());
    //if(pHttpFile->SendRequestEx(strRequest.GetLength()))
    //{
    //CString   FormDataType   =   _T("Content-Type:   application/x-www-form-urlencoded");
    //pHttpFile->SendRequest(FormDataType, strUsername, 12);
    //pHttpFile->SendRequest(NULL, 0, strUsername, 12);
    // pHttpFile->WriteString(strRequest);
    //pHttpFile->EndRequest(); //查询文件状态
    if(pHttpFile->QueryInfoStatusCode(dwFileStatus))
    {
    //如果文件状态正常
    if ((dwFileStatus/100)*100 == HTTP_STATUS_OK)
    {
    CString strLine;
    DWORD   dw ;

    while (pHttpFile->ReadString(strLine)>0)
    strHtml += strLine;

    if(strHtml.Find("success",0)!=-1)
    {
    if (InternetQueryDataAvailable((HINTERNET)(*pHttpFile), &dw, 0, 0) && (dw == 0))
    {
    //设置成功标志
    nSuccess = 0;
    }
    }
    }
    }
    //}
      

  3.   

    //pHttpFile->SendRequest(FormDataType, strUsername, 12);
    //pHttpFile->SendRequest(NULL, 0, strUsername, 12);
    // pHttpFile->WriteString(strRequest); 这三种方式都不成功。另外不知这样写代码对不对:
    pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/edocxj/UploadDoc.action?uploadToken=hpnGKdSLLm2jgC1Y4Qn7tYGQVJGcthB5bvX6lNMDx5zn2Hh0yQ9V!1478105473!1247646219515_1247646391015&proc=docInfo");
    不清楚第二个参数具体是什么意思,
      

  4.   

    pHttpFile->SendRequest(NULL, 0, strUsername, 12); 
     --- 返回什么错误..
      

  5.   

    我说的是  自然会有人  ....
    我只做过POST 密码 获取返回登陆界面   
       没有上传过东西   不过  按道理来说  原理应该一样
      

  6.   

    帮楼主找的几个链接http://group.gimoo.net/review/23229
    http://www.newasp.net/tech/net/12792.html
    http://topic.csdn.net/t/20030714/14/2025842.html
    只能帮到这了...
      

  7.   

    文件上传代码已经可以了,但还有一个问题,如果经过代理上传就不行,我的代理设置的代码如下: char strProxyList[MAX_PATH], strUsername[64], strPassword[64];
    strcpy(strProxyList, "127.0.0.1:808");
    strcpy(strUsername, "fengrongxing");
    strcpy(strPassword, "123456");
    INTERNET_PROXY_INFO proxyinfo;
    proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    proxyinfo.lpszProxy = strProxyList;
    proxyinfo.lpszProxyBypass = NULL;
    Session.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO)); pHttpConnection = Session.GetHttpConnection(defServerName,nPort);   
    pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);  pHttpFile->SetOption(INTERNET_OPTION_PROXY_USERNAME, strUsername, strlen(strUsername)+1);
    pHttpFile->SetOption(INTERNET_OPTION_PROXY_PASSWORD, strPassword, strlen(strPassword)+1);
    大家知道是什么原因吗?
      

  8.   

    我也遇到同样问题,不经过代理上传没问题,网上找了个CCProxy代理软件测试也没问题,但是到客户那的代理就不能上传,楼主解决了么?