HOWTO: Using InternetReadFile To Get File
ID: Q149413
|
The information in this article applies to:
-
Microsoft Internet Explorer (Programming) version 3.0
-
Microsoft Internet Information Server version 3.0
-
Microsoft Windows NT, versions 3.51, 4.0, 4.0 SP4
-
Microsoft Windows 95
SUMMARY
Using a WinInet API, the InternetReadFile returns the following buffer:
<body><h1>HTTP/1.0 406 No acceptable objects were found</h1></body>
MORE INFORMATION
This is an HTTP server specific error. Microsoft IIS may return this error
when there is no proper Accept header ("Accept: */*") in the HTTP request.
Such a header can be added with following APIs:
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;
}
Additional query words:
Keywords : kbnetwork kbprg kbIE300 kbWinInet
Version : WINDOWS:3.0,95; winnt:3.0,3.51,4.0,4.0 SP4
Platform : WINDOWS winnt
Issue type : kbhowto