Article ID: 149413
Article Last Modified on 5/17/2002
InternetOpenUrl(), HttpSendRequest(), HttpAddRequestHeaders()Note that other HTTP servers may or may not behave in the same fashion. The following code demonstrates how to transfer any type of file with WinInet APIs:
BOOL GetFile (HINTERNET IN hOpen, // Handle from InternetOpen()
CHAR *szUrl, // Full URL
CHAR *szFileName) // Local file name
{
DWORD dwSize;
CHAR szHead[] = "Accept: */*\r\n\r\n";
VOID * szTemp[25];
HINTERNET hConnect;
FILE * pFile;
if ( !(hConnect = InternetOpenUrl ( hOpen, szUrl, szHead,
lstrlen (szHead), INTERNET_FLAG_DONT_CACHE, 0)))
{
cerr << "Error !" << endl;
return 0;
}
if ( !(pFile = fopen (szFileName, "wb" ) ) )
{
cerr << "Error !" << endl;
return FALSE;
}
do
{
// Keep coping in 25 bytes chunks, while file has any data left.
// Note: bigger buffer will greatly improve performance.
if (!InternetReadFile (hConnect, szTemp, 50, &dwSize) )
{
fclose (pFile);
cerr << "Error !" << endl;
return FALSE;
}
if (!dwSize)
break; // Condition of dwSize=0 indicate EOF. Stop.
else
fwrite(szTemp, sizeof (char), dwSize , pFile);
} // do
while (TRUE);
fflush (pFile);
fclose (pFile);
return TRUE;
}
The same task can be accomplished with WinInet MFC classes in following
manner:
#include <afx.h>
#include <afxinet.h>
BOOL GetFile (CHAR *szUrl, CHAR *szFileName)
{
TCHAR sz[1024];
CInternetSession session (_T("MyTest agent"), 1,
INTERNET_OPEN_TYPE_DIRECT);
CStdioFile* pFile = NULL;
CHAR szHead[] = "Accept: */*\r\n\r\n";
DWORD nRead;
CFile myFile;
CFileException fileException;
if ( !myFile.Open (szFileName, CFile::modeCreate | CFile::modeReadWrite,
&fileException ) )
{
cerr << "Can't open file: " << szFileName
<< " error = " << fileException.m_cause <<"\n";
return FALSE;
}
try
{
pFile = session.OpenURL (szUrl, 1, INTERNET_FLAG_RELOAD
|INTERNET_FLAG_TRANSFER_BINARY,
szHead, -1L);
}
catch (CInternetException *pEx)
{
cerr <<"OpenUrl failed: "<< pEx-> m_dwError << endl;
return FALSE;
}
do
{
nRead = pFile->Read(sz, 1023);
if (nRead != 0)
myFile.Write (sz, nRead);
}
while (nRead != 0);
myFile.Close();
pFile->Close();
if (pFile != NULL)
delete pFile;
session.Close();
return TRUE;
}Keywords: kbhowto kbnetwork kbprogramming KB149413