这段代码是一个使用C语言和libcurl库编写的程序,用于从指定的URL下载图片并保存到本地文件中。下面是该代码的详细介绍:
- 包含头文件:
c
#include <stdio.h>
#include <curl/curl.h>
这两个头文件分别是标准I/O库和libcurl库的头文件。
- 定义回调函数:
c
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
size_t realsize = size * nmemb;
FILE* fptr = (FILE*)userp;
if (fptr) {
fwrite(contents, size, nmemb, fptr);
}
return realsize;
}
这是一个用于写入数据的回调函数。当libcurl从URL下载数据时,该函数将被调用。它接收四个参数:要写入的数据、数据的大小、数据的数量以及一个用户指针。在这个例子中,用户指针是一个指向要写入的文件的指针。回调函数将数据写入文件中,并返回实际写入的字节数。
- 主函数:
c
int main(void) {
CURL* curl;
FILE* fp;
CURLcode res;
在主函数中,声明了三个变量:一个CURL句柄、一个文件指针和一个CURLcode变量,用于存储libcurl操作的结果。
- 设置URL和输出文件名:
c
const char* url = "https://img0.baidu.com/it/u=3266170887,416558327&fm=253&fmt=auto?w=1289&h=800"; // 替换为目标图片的URL
char outfilename[FILENAME_MAX] = "picture.jpg"; // 保存图片的本地路径和文件名
这里定义了要下载图片的URL和保存图片的本地文件名。注意,这里的URL是一个示例,你需要将其替换为你要下载的图片的实际URL。
- 初始化CURL句柄:
c
curl = curl_easy_init();
使用curl_easy_init()
函数初始化CURL句柄。如果初始化成功,将返回一个非空CURL句柄。如果初始化失败,将返回NULL。
- 打开输出文件:
c
fp = fopen(outfilename, "wb");
使用fopen()
函数以二进制写模式("wb")打开输出文件。如果打开成功,将返回一个非空文件指针。如果打开失败,将返回NULL。
- 设置libcurl选项:
- 设置URL:
curl_easy_setopt(curl, CURLOPT_URL, url);
- 设置回调函数:
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
- 设置写入数据的用户指针
这些选项分别设置了要下载的URL、用于写入数据的回调函数和写入数据的用户指针(即文件指针)。:curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
- 执行libcurl操作
。该函数将执行下载操作。如果操作成功,将返回CURLE_OK。否则,将返回一个错误代码。你可以使用res = curl_easy_perform(curl);
curl_easy_strerror(res)
函数获取错误消息的字符串表示形式。
完整代码:
#include <stdio.h>
#include <curl/curl.h>
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
size_t realsize = size * nmemb;
FILE* fptr = (FILE*)userp;
if (fptr) {
fwrite(contents, size, nmemb, fptr);
}
return realsize;
}
int main(void) {
CURL* curl;
FILE* fp;
CURLcode res;
const char* url = "https://img0.baidu.com/it/u=3266170887,416558327&fm=253&fmt=auto?w=1289&h=800"; // 替换为目标图片的URL
char outfilename[FILENAME_MAX] = "picture.jpg"; // 保存图片的本地路径和文件名
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename, "wb");
if (fp) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
fclose(fp);
}
curl_easy_cleanup(curl);
}
return 0;
}