#include
#include"down.h"
#include
#include
#include
#include
using namespace std;
#pragma comment(lib,"urlmon.lib")
#pragma comment(lib,"ws2_32.lib")
#void down(string url, string SavePath);
void down(string url, string savepath)
{
/*time_t lt;
lt = time(NULL);
url = url + "?" + to_string(lt);
*/
size_t len = url.length();
//获取字符串长度
int nmlen = MultiByteToWideChar(CP_ACP, 0, url.c_str(), len + 1, NULL, 0);
//如果函数运行成功,并且cchWideChar为零,
//返回值是接收到待转换字符串的缓冲区所需求的宽字符数大小。
wchar_t* buffer = new wchar_t[nmlen];
MultiByteToWideChar(CP_ACP, 0, url.c_str(), len + 1, buffer, nmlen);
//DeleteUrlCacheEntry(imgsavepath);
DeleteUrlCacheEntry(buffer);
HRESULT hr = URLDownloadToFile(NULL, buffer, _T(".\\temp\\0.jpg"), 0, NULL);
if (hr == S_OK)
{
cout << "-------下载完成---------------------" << endl;
}
else
{
cout << "---------------图片下载失败---------------------------" << endl;
}
}
上面的方法存在一个致命问题就是占用磁盘增加,导致最后磁盘爆满,后面采用了另外一种方法
void download(const char* Url, const char* save_as)
{byte Temp[MAXBLOCKSIZE];
ULONG Number = 1;
FILE* stream;
HINTERNET hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
HINTERNET handle2 = InternetOpenUrl(hSession, Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (handle2 != NULL)
{if ((stream = fopen(save_as, "wb")) != NULL)
{
while (Number > 0)
{
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
fwrite(Temp, sizeof(char), Number, stream);
}
fclose(stream);
}InternetCloseHandle(handle2);
handle2 = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
}
【c++|C++通过url直接下载图片并保存】
推荐阅读
- 【学习笔记】
- std::cout 输出 unsigned char类型数据
- c++|相机位姿和相机外参定义以及它们的关系(画出相机位置)
- #|常用C/C++开源库
- c++|c++ 分布式令牌桶_分布式之流量控制
- 算法|二进制,八进制,十进制,十六进制的相互转换【简单易懂】
- c++|动手打造深度学习框架(基本数据结构与算法)
- C++|基于协程io_uring 异步网络库系列 III( Proactor、异步与协程 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记)
- cpp|c++入门学习——使用C++做一个yolov5视频检测