小记 libcurl下载

本文介绍了一个使用CURL库从远程服务器下载文件到内存,并将内存中的数据保存到本地文件的例子。通过定义内存结构体和回调函数,实现了动态内存分配及写入功能。

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

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值