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

C、C++和Java语言
回复
GodPig
帖子: 240
注册时间: 2007-04-27 23:07
送出感谢: 0
接收感谢: 0

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

#1

帖子 GodPig » 2008-01-13 3:46

现在都快让这个问题折腾的无奈了

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

我应该怎么做???
谢谢
Jaguar_Jacky
帖子: 6
注册时间: 2007-08-08 15:22
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 Jaguar_Jacky » 2008-02-08 21:31

用线程来下载!
回复

回到 “C/C++/Java”