vc实现https文件下载

不多说废话,直接上代码。

.h文件

#pragma once
class CDownloadHttps
{
public:
	CDownloadHttps();
	~CDownloadHttps();

	static BOOL DownloadFile(std::wstring serverName, std::wstring objectName, std::wstring path);
};

.cpp文件

#include "stdafx.h"
#include "DownloadHttps.h"
#include "windows.h"
#include "winhttp.h"

#pragma comment(lib,"Winhttp.lib")

CDownloadHttps::CDownloadHttps()
{
}


CDownloadHttps::~CDownloadHttps()
{
}

BOOL CDownloadHttps::DownloadFile(std::wstring serverName, std::wstring objectName, std::wstring path)
{
	HINTERNET hOpen = 0;
	HINTERNET hConnect = 0;
	HINTERNET hRequest = 0;
	BOOL bResult = FALSE;

	do {
		hOpen = WinHttpOpen(_T("DownloadFile"), WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
			WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
		if (!hOpen) {
			wprintf(L"WinHttpOpen failed (0x%.8X)\n", GetLastError());
			break;
		}
		hConnect = WinHttpConnect(hOpen, serverName.c_str(), INTERNET_DEFAULT_HTTPS_PORT, 0);
		if (!hConnect) {
			wprintf(L"WinHttpConnect failed (0x%.8X)\n", GetLastError());
			break;
		}
		// use flag WINHTTP_FLAG_SECURE to initiate SSL
		hRequest = WinHttpOpenRequest(hConnect, L"GET", objectName.c_str(),
			NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
		if (!hRequest)
		{
			wprintf(L"WinHttpOpenRequest failed (0x%.8X)\n", GetLastError());
			break;
		}
		if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
		{
			wprintf(L"WinHttpSendRequest failed (0x%.8X)\n", GetLastError());
			break;
		}
		if (!WinHttpReceiveResponse(hRequest, 0))
		{
			wprintf(L"WinHttpReceiveResponse failed (0x%.8X)\n", GetLastError());
			break;
		}
		// query remote file size, set haveContentLength on success and dwContentLength to the length
		TCHAR szContentLength[32] = { 0 };
		DWORD cch = 64;
		DWORD dwHeaderIndex = WINHTTP_NO_HEADER_INDEX;
		BOOL haveContentLength = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_LENGTH, NULL,
			&szContentLength, &cch, &dwHeaderIndex);
		DWORD dwContentLength;
		if (haveContentLength) dwContentLength = _wtoi(szContentLength);

		BYTE Buffer[4096];
		HANDLE hFile = CreateFile(path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
		if (hFile == INVALID_HANDLE_VALUE) {
			wprintf(L"CreateFile(%s) failed (0x%.8X)\n", path.c_str(), GetLastError());
			break;
		}

		DWORD dwSize, dwWrite;
		while (WinHttpQueryDataAvailable(hRequest, &dwSize) && dwSize) {
			if (dwSize > 4096) dwSize = 4096;

			WinHttpReadData(hRequest, Buffer, dwSize, &dwSize);
			WriteFile(hFile, Buffer, dwSize, &dwWrite, NULL);
		}
		CloseHandle(hFile);
		bResult = TRUE;
	} while (FALSE);

	if (hRequest) WinHttpCloseHandle(hRequest);
	if (hConnect) WinHttpCloseHandle(hConnect);
	if (hOpen) WinHttpCloseHandle(hOpen);

	return bResult;
}

参考了http://www.cppblog.com/zhupf/archive/2013/07/02/201459.aspx的内容,稍微改了下。转载请注明出处。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vc http 客户端是一个用于发送和接收 HTTP 请求和响应的客户端程序。它通过使用 VC 编程语言实现,可以在计算机上与服务器进行通信。 vc http 客户端的功能主要包括: 1. 发送 HTTP 请求:通过 vc http 客户端,我们可以发送各种类型的 HTTP 请求,如 GET、POST、PUT、DELETE 等。我们可以指定要访问的 URL 和发送的数据,以及其他一些请求头信息。 2. 接收 HTTP 响应:vc http 客户端能够接收从服务器返回的 HTTP 响应,包括响应状态码、响应头和响应体等。我们可以根据响应来进行相应的处理,如解析响应数据、错误处理等。 3. 管理会话状态:vc http 客户端还可以管理会话状态。通过使用 Cookie 和其他身份验证机制,客户端可以保持与服务器的会话状态,并在后续的请求中使用。 4. 支持安全通信:vc http 客户端支持使用 HTTPS 协议进行安全通信。可以通过配置证书和密钥来确保通信的安全性,防止信息泄漏和篡改。 5. 处理错误和异常:vc http 客户端能够处理各种错误和异常情况。例如,如果服务器返回错误的状态码,客户端可以根据情况进行相应的处理,如重试、报错等。 6. 提供易用的接口:vc http 客户端一般会提供简单易用的接口,使开发者可以方便地使用它进行 HTTP 通信,而无需了解复杂的协议细节。 总的来说,vc http 客户端是一个方便实用的工具,可以帮助我们在编程中与服务器进行 HTTP 通信,并能处理各种请求和响应情况。通过使用它,我们可以轻松地与各种在线服务进行交互,如获取数据、上传文件等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值