LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1846|回复: 2

如何用libcurl,在一个程序中,下载多张图片?(已解决)

[复制链接]
发表于 2008-1-13 04:02:36 | 显示全部楼层 |阅读模式
我将这些网址保存在一个url.txt文件中,然后在程序中逐行读取
如:url.txt的内容为:
http://www.baidu.com/img/logo.gif
http://gimg.baidu.com/img/gs.gif
http://img.baidu.com/hi/img/index/i4.gif

程序的关键代码如下:

while(fgets(html, 120, srcf))
{
imgfile.filename = strrchr(html, '/');
imgfile.filename += 1;
curl_easy_setopt(curl, CURLOPT_URL, html);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_image); //设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &imgfile); //给回调函数的第四个参数
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_perform(curl);
}


下载不下来图片

如果将curl_easy_perform(curl)移到while外面,则只能下载最后一张图片,即14.gif

我不知道是什么原因造成的???
我到现在对libcurl还基本不了解

后来我就想每次都用一个curl,即在一个函数中声明CURL *curl的局部变量,然后递归调用,看是否能成功
完整代码如下:
#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string.h>

struct FtpFile //定义一个结构为了传递给my_fwrite函数.可用curl_easy_setopt的CURLOPT_WRITEDATA选项传递
{
char *filename;
FILE *stream;
};

int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out=(struct FtpFile *)stream; // stream指针其实就是 指向struct FtpFile ftpfile的
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb"); //没有这个流的话就创建一个 名字是out->filename.
if(!out->stream)
return -1;
}
return fwrite(buffer, size, nmemb, out->stream);
}

int function(char *bufaddr);

char *imgname;

struct FtpFile ftpfile={NULL, NULL}; //初始化一个FtpFile结构

char buf[100] = {0};

FILE *fp;

int main(int argc, char *argv[])
{
CURL *curl;
//CURLcode res;

fp = fopen("url.txt", "r");

curl = curl_easy_init();
if(curl)
{
curl_global_init(CURL_GLOBAL_DEFAULT);
function(fgets(buf, 100, fp));
curl_easy_cleanup(curl);
}
if(ftpfile.stream)
fclose(ftpfile.stream);
curl_global_cleanup();

return 0;
}

int function(char *bufaddr)
{
if(bufaddr == NULL)
{
return 0;
}
CURL *curl;
curl = curl_easy_init();

imgname = strtok(bufaddr, "\n");
imgname = strrchr(bufaddr, '/');
imgname += 1;
ftpfile.filename = imgname;
fprintf(stderr, "name is: %s\n", imgname);
curl_easy_setopt(curl, CURLOPT_URL,buf);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
curl_easy_perform(curl);
curl_easy_cleanup(curl);

function(fgets(buf, 100, fp));
return 1;
}


编译运行,结果只能下载下来第一张图片,即logo.gif

我应该怎么做???
谢谢
发表于 2008-1-13 09:13:42 | 显示全部楼层
curl_easy_perform 后,每接收到一段数据,libcurl 就会调用你定义的回调函数 my_fwrite。所以,你的程序的结果是全部图片的数据都写到一个图片指定的文件中了。

修改的方法是,在 curl_easy_perform 之前先打开文件,在 curl_easy_perform 之后关闭文件。my_fwrite 把接收到的数据写入到已经打开好的文件中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-13 12:23:35 | 显示全部楼层
太感谢了,按照您的方法,问题已经解决了!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表