当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 如何用libcurl,在一个程序中,下载多张图片?(已解决)
帖子发表于 : 2008-01-13 3:46 

注册: 2007-04-27 23:07
帖子: 240
送出感谢: 0 次
接收感谢: 0 次
现在都快让这个问题折腾的无奈了

我将这些网址保存在一个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

我应该怎么做???
谢谢


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-02-08 21:31 

注册: 2007-08-08 15:22
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
用线程来下载!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译