C++ 从internet下载文件,HttpSendRequest失败,错误代码为
我正在创建一个可以从互联网下载文件的程序。 在下载文件之前,我想获得文件大小,我尝试了InternetQueryDataAvailable,但它给出的值为0 然后我尝试了hHttpRequest,但它给出了错误代码error\u HTTP\u HEADER\u NOT\u FOUND。所以我添加了HttpSendRequest,但它给出的错误代码是error\u INTERNET\u无效的\u URL 我使用avg站点作为测试站点: 要下载的文件: avg_free_x86_all_2014_4259a6848.exe 任何帮助都很好,谢谢 代码:C++ 从internet下载文件,HttpSendRequest失败,错误代码为,c++,windows,C++,Windows,我正在创建一个可以从互联网下载文件的程序。 在下载文件之前,我想获得文件大小,我尝试了InternetQueryDataAvailable,但它给出的值为0 然后我尝试了hHttpRequest,但它给出了错误代码error\u HTTP\u HEADER\u NOT\u FOUND。所以我添加了HttpSendRequest,但它给出的错误代码是error\u INTERNET\u无效的\u URL 我使用avg站点作为测试站点: 要下载的文件: avg_free_x86_all_2014_
调用
InternetConnect()
时,仅为主机名指定“download.avgfree.com”
,而不是URL
调用HttpOpenRequest()
时,指定“/filedir/inst/avg\u free\u x86\u all\u 2014\u 4259a6848.exe”
作为请求的对象,而不是文件名本身
用于将完整URL划分为各个组件,将lpszHostName
和nPort
字段传递给InternetConnect()
,将lpszUrlPath
字段传递给HttpOpenRequest()
下载时也不需要知道文件大小。事实上,下载开始时,有时不知道文件大小。有时候会有。无论哪种方式,您都可以在循环中调用InternetReadFile()
,直到它报告没有更多数据可接收为止。让它在内部为您处理文件大小
顺便说一句,看看这个函数。让它为您处理这些详细信息。调用
InternetConnect()
时,只需为主机名指定“download.avgfree.com”
,而不是URL
调用HttpOpenRequest()
时,指定“/filedir/inst/avg\u free\u x86\u all\u 2014\u 4259a6848.exe”
作为请求的对象,而不是文件名本身
用于将完整URL划分为各个组件,将lpszHostName
和nPort
字段传递给InternetConnect()
,将lpszUrlPath
字段传递给HttpOpenRequest()
下载时也不需要知道文件大小。事实上,下载开始时,有时不知道文件大小。有时候会有。无论哪种方式,您都可以在循环中调用InternetReadFile()
,直到它报告没有更多数据可接收为止。让它在内部为您处理文件大小
顺便说一句,看看这个函数。让它来为您处理这些细节。感谢您快速而出色的回答。对于使用HttpQueryInfo获取文件大小的任何人,请确保包含HTTP\u QUERY\u FLAG\u NUMBER FLAG。感谢您快速而出色的回答。对于使用HttpQueryInfo获取文件大小的任何人,请确保包含HTTP\u QUERY\u标志\u NUMBER标志。
DWORD DownloadFile(PCHAR SaveDirectory)
{
HINTERNET hInternet;
CHAR StrBuffer[100];
hInternet = InternetOpen(InternetAgent, PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);
if (hInternet != NULL)
{
CHAR TestUrl[] = "http://download.avgfree.com/filedir/inst";
CHAR TestFileName[] = "avg_free_x86_all_2014_4259a6848.exe";
HINTERNET hHttpSession = InternetConnect(hInternet, TestUrl, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (hHttpSession != NULL)
{
PCTSTR AcceptTypes[] = {"text/*", "application/exe", "application/zlib", "application/gzip", "application/applefile", NULL};
//I dont think application/exe is valid, but i could Not find a .exe format in the msdn list.
//http://www.iana.org/assignments/media-types/media-types.xhtml#application for the list
HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", TestFileName, "HTTP/1.1", TestUrl, &AcceptTypes[0],
INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE, 0);
if (hHttpRequest != NULL)
{
DWORD FileSize = 0;
DWORD BufferLength = sizeof(FileSize);
if (HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0))
{
//See if HttpQueryInfo can get the file size.
if (HttpQueryInfo(hHttpRequest, HTTP_QUERY_CONTENT_LENGTH, &FileSize, &BufferLength, NULL))
{
sprintf_s(StrBuffer, sizeof(StrBuffer), "%u", FileSize);
MessageBox(MainWinHwnd, StrBuffer, "File Size", MB_OK);
}
else MessageBox(MainWinHwnd, "Failed to get the file size.", NULL, MB_OK);
//See if InternetQueryDataAvailable can get the file size.
if (InternetQueryDataAvailable(hHttpRequest, &FileSize, 0, 0))
{
sprintf_s(StrBuffer, sizeof(StrBuffer), "%u", FileSize);
MessageBox(MainWinHwnd, StrBuffer, "File Size", MB_OK);
}
else
{
MessageBox(MainWinHwnd, "Failed to get the file size.", NULL, MB_OK);
}
}
else
{
DWORD LastError = GetLastError();
sprintf_s(StrBuffer, sizeof(StrBuffer), "%u", LastError);
MessageBox(NULL, StrBuffer, NULL, MB_OK);
}
InternetCloseHandle(hHttpRequest);
}
else MessageBox(NULL, "Error #3", NULL, MB_OK);
InternetCloseHandle(hHttpSession);
}
else MessageBox(NULL, "Error #2", NULL, MB_OK);
InternetCloseHandle(hInternet);
}
else MessageBox(NULL, "Error #1", NULL, MB_OK);
return TRUE;
}