#include "stdafx.h"
#include "../../curl/curl.h"
#pragma comment(lib, "curllib.lib")
struct MemoryStruct
{
char *memory;
size_t size;
};
//添加一个全局变量
struct MemoryStruct chunk;
static void *myrealloc(void *ptr, size_t size)
{
/* There might be a realloc() out there that doesn't like reallocing
NULL pointers, so we take care of it here */
if(ptr)
return realloc(ptr, size);
else
return malloc(size);
}
static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
//我们给定了一个足够大的内存,不需要重新申请
struct MemoryStruct *mem = (struct MemoryStruct *)data;
mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);
if (mem->memory) {
memcpy(&(mem->memory[mem->size]), ptr, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
}
return realsize;
}
int getFileInBuffer()
{
CURL *curl_handle;
chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
chunk.size = 0; /* no data at this point */
curl_global_init(CURL_GLOBAL_ALL);
/* init the curl session */
curl_handle = curl_easy_init();
/* specify URL to get */
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://img1.gtimg.com/sports/pics/hv1/117/247/625/40703727.jpg");
/* send all data to this function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
/* we pass our 'chunk' struct to the callback function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
/* some servers don't like requests that are made without a user-agent
field, so we provide one */
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
/* get it! */
curl_easy_perform(curl_handle);
/* cleanup curl stuff */
curl_easy_cleanup(curl_handle);
/*
* Now, our chunk.memory points to a memory block that is chunk.size
* bytes big and contains the remote file.
*
* Do something nice with it!
*
* You should be aware of the fact that at this point we might have an
* allocated data block, and nothing has yet deallocated that data. So when
* you're done with it, you should free() it as a nice application.
*/
if(chunk.memory)
{
{
FILE* file = fopen("e://downfile", "w+b");
if (file)
{
fwrite(chunk.memory, chunk.size, 1, file);
fflush(file);
fclose(file);
}
}
free(chunk.memory);
}
/* we're done with libcurl, so clean it up */
curl_global_cleanup();
return chunk.size;
}
int _tmain(int argc, _TCHAR* argv[])
{
getFileInBuffer();
return 0;
}
本文介绍了一个使用CURL库从远程服务器下载文件到内存,并将内存中的数据保存到本地文件的例子。通过定义内存结构体和回调函数,实现了动态内存分配及写入功能。
2049

被折叠的 条评论
为什么被折叠?



