如何用wininet函数实现http post方式的多文件上传

ming111 2008-04-08 04:35:43
如何用wininet函数实现http post方式的多文件上传,这个回调函数实现的是一个文件的上传,如何判断多个文件都上传完成了呢?
我现在只要都上传完成,返回一个值就行了
CString CFileUpload::UploadThread(CString url,CString filename,int num)
{
CString defServerName,defObjectName;
int nRet =0;
INTERNET_PORT nPort;
DWORD dwServiceType = 0;

nRet = AfxParseURL( (LPCTSTR)url, dwServiceType, defServerName, defObjectName, nPort );

if( !nRet || dwServiceType != INTERNET_SERVICE_HTTP )
{
AfxMessageBox( "不能保存请求保存的网页的源代码。原因可能如下:\r\n\r\n1)请求不是一个HTTP请求。\r\n\r\n2)所请求的URL无法到达。" );
//return FALSE;
return "false";
}

CInternetSession Session("my session");
CHttpConnection *pHttpConnection = NULL;
CFile fTrack;
CHttpFile* pHTTP;
CString strHTTPBoundary;
CString strPreFileData;
CString strPostFileData;
DWORD dwTotalRequestLength;
DWORD dwChunkLength;
DWORD dwReadLength;
TCHAR szError[MAX_PATH];
void* pBuffer;
CString strResponse;
BOOL bSuccess = TRUE;
CString test;


CString strDebugMessage;

if (FALSE == fTrack.Open(filename, CFile::modeRead | CFile::shareDenyWrite))
{
AfxMessageBox(_T("Unable to open the file."));
return "false ";
}

int iRecordID = 1;
strHTTPBoundary = _T("IllBeVerySurprised");
strPreFileData = MakePreFileData(strHTTPBoundary, info.filename, iRecordID);
strPostFileData = MakePostFileData(strHTTPBoundary);

dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + fTrack.GetLength();

dwChunkLength = 64 * 1024;

pBuffer = malloc(dwChunkLength);

if (NULL == pBuffer)
{
return "false";
}

try
{
pHttpConnection = Session.GetHttpConnection(defServerName,nPort);
pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);
pHTTP->AddRequestHeaders(MakeRequestHeaders(strHTTPBoundary));
pHTTP->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);

pHTTP->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());

dwReadLength = -1;
while (0 != dwReadLength)
{
strDebugMessage.Format(_T("%u / %u\n"), fTrack.GetPosition(), fTrack.GetLength());
TRACE(strDebugMessage);
dwReadLength = fTrack.Read(pBuffer, dwChunkLength);
if (0 != dwReadLength)
{
pHTTP->Write(pBuffer, dwReadLength);
}
}

pHTTP->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());

pHTTP->EndRequest(HSR_SYNC);

CString fileContent ="";
CString string ="";

while( pHTTP->ReadString( string ) )
{
fileContent += "\r\n" + string;
}
fileContent.TrimRight();
printf(" %s\n " ,(LPCTSTR)fileContent);

pHTTP->Close();
pHttpConnection->Close();
delete pHTTP;
delete pHttpConnection;

fTrack.Close();
Session.Close();

if (NULL != pBuffer)
{
free(pBuffer);
}

return fileContent;


}

catch (CException* e)
{
e->GetErrorMessage(szError, MAX_PATH);
e->Delete();
AfxMessageBox(szError);
bSuccess = FALSE;
}

return "false";

}
...全文
198 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
都是很好的建议! 值得学习
skyful123 2008-04-09
  • 打赏
  • 举报
回复
UP
mr.zhoux 2008-04-08
  • 打赏
  • 举报
回复
轮流上传不行么?
jameshooo 2008-04-08
  • 打赏
  • 举报
回复
因为这是同步调用,只有文件都上传完毕函数才返回,所以依次调用就行了
jameshooo 2008-04-08
  • 打赏
  • 举报
回复
针对每个文件都调用一次UploadThread

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧