如何用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";}
我现在只要都上传完成,返回一个值就行了
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";}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货