gpt4 book ai didi

c++ - 从 Internet 下载文件,HttpSendRequest 失败并显示错误代码

转载 作者:行者123 更新时间:2023-11-27 23:10:21 25 4
gpt4 key购买 nike

我正在创建一个可以从 Internet 下载文件的程序。在下载文件之前,我想获取文件大小,我已经尝试过 InternetQueryDataAvailable,但它给出的值为 0。

然后我尝试了 hHttpRequest,但它给出了错误代码 ERROR_HTTP_HEADER_NOT_FOUND。所以我添加了 HttpSendRequest,但它给出了错误代码 ERROR_INTERNET_INVALID_URL。

我将 avg 站点用作测试站点: http://free.avg.com/us-en/download-free-all-product

要下载的文件:avg_free_x86_all_2014_4259a6848.exe

任何帮助都会很好,谢谢。

代码:

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;
}

最佳答案

调用 InternetConnect() 时,仅指定 "download.avgfree.com" 本身作为主机名,而不是 URL。

调用 HttpOpenRequest() 时,指定 "/filedir/inst/avg_free_x86_all_2014_4259a6848.exe" 作为要请求的对象,而不是文件名本身。

使用InternetCrackUrl()将完整的 URL 分成各个部分,将 lpszHostNamenPort 字段传递给 InternetConnect()lpszUrlPath 字段到 HttpOpenRequest()

您也无需知道文件大小即可下载。事实上,有时下载开始时不知道文件大小。有时会有。无论哪种方式,您都可以简单地在循环中调用 InternetReadFile(),直到它报告没有更多数据可接收为止。让它在内部为您处理文件大小。

顺便说一句,看看URLDownloadToFile()功能。让它为您处理这些细节。

关于c++ - 从 Internet 下载文件,HttpSendRequest 失败并显示错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com