下载文件的代码已经能够实现,但上传文件测试了快一个小时了也没搞定呢,希望使用过的朋友提供下,谢谢!
解决方案 »
- WSAAsyncSelect模型
- USB端口的分析
- 工作线程有没有消息队列?有没有方法实现类似消息队列的功能?
- 如何制作3d max 式的工具栏呢?哎,我现在可用分是0分
- 屏保程序
- 请问有WVAE格式的代码吗?(C/C++)高分相酬
- "0z77568fcd"指令引用的“0X00300033”内存,该内存不能为"read" ??是不是因为装了NORTON2000??回答有分
- 呵呵~~~~新手如何上路!!
- vc程序怎样发部,需要什么样的动态连接库?(CSocket的)------->>
- 高手请进!!!!!!!!!!!
- SetWindowLong(pWnd->m_hWnd,GWL_USERDATA,(LONG)this);啥意思?
- 如何将读到的硬盘smart温度数据转换成 摄氏度
呵呵,,你是不是想看啊,下载文件的核心代码: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;
}
}
我的代码:
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;
}
}
}
}
//}
//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");
不清楚第二个参数具体是什么意思,
--- 返回什么错误..
我只做过POST 密码 获取返回登陆界面
没有上传过东西 不过 按道理来说 原理应该一样
http://www.newasp.net/tech/net/12792.html
http://topic.csdn.net/t/20030714/14/2025842.html
只能帮到这了...
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);
大家知道是什么原因吗?