Comment télécharger un fichier avec WinHTTP en C/C++?
Je sais comment faire pour télécharger un fichier html/txt page. Par exemple :
//Variables
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
vector <string> vFileContent;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
//Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
//Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"nytimes.com",
INTERNET_DEFAULT_HTTP_PORT, 0);
//Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"GET", L"/ref/multimedia/podcasts.html",
NULL, WINHTTP_NO_REFERER,
NULL,
NULL);
//Send a request.
if (hRequest)
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0,
0, 0);
//End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);
//Keep checking for data until there is nothing left.
if (bResults)
do
{
//Check for available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
printf( "Error %u in WinHttpQueryDataAvailable.\n",
GetLastError());
//Allocate space for the buffer.
pszOutBuffer = new char[dwSize+1];
if (!pszOutBuffer)
{
printf("Out of memory\n");
dwSize=0;
}
else
{
//Read the Data.
ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded))
{
printf( "Error %u in WinHttpReadData.\n",
GetLastError());
}
else
{
printf("%s", pszOutBuffer);
//Data in vFileContent
vFileContent.push_back(pszOutBuffer);
}
//Free the memory allocated to the buffer.
delete [] pszOutBuffer;
}
} while (dwSize>0);
//Report any errors.
if (!bResults)
printf("Error %d has occurred.\n",GetLastError());
//Close any open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
//Write vFileContent to file
ofstream out("test.txt",ios::binary);
for (int i = 0; i < (int) vFileContent.size();i++)
out << vFileContent[i];
out.close();
Lorsque j'essaie de télécharger une photo, je ne reçois que les premières lignes du fichier et aucun message d'erreur. Le problème semble lié à ce paramètre (ppwszAcceptTypes) dans WinHttpOpenRequest Fonction.
Juste une petite remarque sur votre allocation dynamique de la mémoire - vous les répartir comme
Importer le msxml6 de la bibliothèque. Il est livré avec (vista peut-être? win7 pour vous et vers le haut) et est installible sur XP. Initier COM et le fait de créer une IXMLHTTPRequest objet et d'envoyer une demande. Beaucoup plus facile que de WinHttp bibliothèques et de jongler avec les certs. msdn.microsoft.com/en-us/library/ms759148(v=vs. 85).aspx
pszOutBuffer = new char[dwSize+1];
et après que l'enregistrement du pointeur. Vous ne devriez pas, parce que le nouvel opérateur va lever une exception en cas de manque de mémoire par défaut. Pour éviter cela, vous devez fournir std::nothrow
à l'opérateur new, comme ce pszOutBuffer = new(std::nothrow) char[dwSize+1];
- dans ce cas, le pointeur est null si il y a un manque de mémoire.Importer le msxml6 de la bibliothèque. Il est livré avec (vista peut-être? win7 pour vous et vers le haut) et est installible sur XP. Initier COM et le fait de créer une IXMLHTTPRequest objet et d'envoyer une demande. Beaucoup plus facile que de WinHttp bibliothèques et de jongler avec les certs. msdn.microsoft.com/en-us/library/ms759148(v=vs. 85).aspx
OriginalL'auteur | 2009-05-05
Vous devez vous connecter pour publier un commentaire.
Ressemble à ce fil de discussion MSDN est le même et a la solution
http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/45ccd91c-6794-4f9b-8f4f-865c76cc146d
OriginalL'auteur Lou Franco
Solution :
OriginalL'auteur
Simplement en ouvrant la ofstream en mode binaire ne modifiez pas la manière que la << le travail des opérateurs - ils toujours perfform sortie formatée. Vous avez besoin d'utiliser le flux de l'écriture de la fonction de (), qui n'est pas mise en forme de la sortie.
OriginalL'auteur