gpt4 book ai didi

c++ - UrlDownloadToFile 到内存

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:08 25 4
gpt4 key购买 nike

我正在使用 URLDownloadToFile() 将图像从 Web 服务器下载到我桌面上的目录。如果我不想将图像保存到磁盘,而是想将它们读入内存(如字节数组或 base64 字符串等),是否有类似于 URLDownloadToFile() 的函数可以实现此目的?

最佳答案

URLOpenStream() , URLOpenBlockingStream()URLOpenPullStream()它允许您下载到内存中。

从这三个中,URLOpenBlockingStream()似乎是最直接使用的,因为它返回一个 IStream 指针,您可以从中同步读取一个循环。尽管它不像 URLDownloadToFile() 那样是一个全能 函数,但使用起来并不难。

这是 URLOpenBlockingStream() 的完整示例控制台应用程序.它从 URL 下载并将响应写入标准输出。取而代之的是,您可以将响应存储在 std::vector 中,或者用它做任何您喜欢的事情。

#include <Windows.h>
#include <Urlmon.h> // URLOpenBlockingStreamW()
#include <atlbase.h> // CComPtr
#include <iostream>
#pragma comment( lib, "Urlmon.lib" )

struct ComInit
{
HRESULT hr;
ComInit() : hr( ::CoInitialize( nullptr ) ) {}
~ComInit() { if( SUCCEEDED( hr ) ) ::CoUninitialize(); }
};

int main(int argc, char* argv[])
{
ComInit init;

// use CComPtr so you don't have to manually call Release()
CComPtr<IStream> pStream;

// Open the HTTP request.
HRESULT hr = URLOpenBlockingStreamW( nullptr, L"http://httpbin.org/headers", &pStream, 0, nullptr );
if( FAILED( hr ) )
{
std::cout << "ERROR: Could not connect. HRESULT: 0x" << std::hex << hr << std::dec << "\n";
return 1;
}

// Download the response and write it to stdout.
char buffer[ 4096 ];
do
{
DWORD bytesRead = 0;
hr = pStream->Read( buffer, sizeof(buffer), &bytesRead );

if( bytesRead > 0 )
{
std::cout.write( buffer, bytesRead );
}
}
while( SUCCEEDED( hr ) && hr != S_FALSE );

if( FAILED( hr ) )
{
std::cout << "ERROR: Download failed. HRESULT: 0x" << std::hex << hr << std::dec << "\n";
return 2;
}

std::cout << "\n";

return 0;
}

关于c++ - UrlDownloadToFile 到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027725/

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