首先基于环境的配置这里不做详细描述,请务必保证依赖所需的库文件加载进去
通过libcurl下载文件,方法实现如下:
#include <stdio.h> #include <curl/curl.h> #include "DownloadInfo.h" /************************************************************************/ /* create by: mengxiaoxin date:2014/12/9 */ /************************************************************************/ /* libcurl write callback function */ size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written = fwrite(ptr, size, nmemb, stream); return written; } /* Function: libcurl connection initialization download file Parameters: (const char* url, const char outfilename[FILENAME_MAX]) url: 要下载文件的url地址 outfilename: 下载文件指定的文件名 */ int DOWNLOAD_FILE(const char* url, const char outfilename[FILENAME_MAX]){ CURL *curl; FILE *fp; CURLcode res; /* 调用curl_global_init()初始化libcurl */ res = curl_global_init(CURL_GLOBAL_ALL); if (CURLE_OK != res) { printf("init libcurl failed."); curl_global_cleanup(); return -1; } /* 调用curl_easy_init()函数得到 easy interface型指针 */ curl = curl_easy_init(); if (curl) { fopen_s(&fp,outfilename,"wb"); /* 调用curl_easy_setopt()设置传输选项 */ res = curl_easy_setopt(curl, CURLOPT_URL, url); if (res != CURLE_OK) { fclose(fp); curl_easy_cleanup(curl); return -1; } /* 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务 */ res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); if (res != CURLE_OK) { fclose(fp); curl_easy_cleanup(curl); return -1; } /* 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务 */ res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); if (res != CURLE_OK) { fclose(fp); curl_easy_cleanup(curl); return -1; } res = curl_easy_perform(curl); // 调用curl_easy_perform()函数完成传输任务 fclose(fp); /* Check for errors */ if(res != CURLE_OK){ fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res)); curl_easy_cleanup(curl); return -1; } /* always cleanup */ curl_easy_cleanup(curl); // 调用curl_easy_cleanup()释放内存 } curl_global_cleanup(); return 0; }
以上代码是基于官方修改而成
官方的例子程序如下:
/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 1998 - 2012, Daniel Stenberg, <[email protected]>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://curl.haxx.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ***************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <curl/curl.h> static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) { size_t written = fwrite(ptr, size, nmemb, (FILE *)stream); return written; } int main(int argc, char *argv[]) { CURL *curl_handle; static const char *pagefilename = "page.out"; FILE *pagefile; if(argc < 2 ) { printf("Usage: %s <URL>\n", argv[0]); return 1; } curl_global_init(CURL_GLOBAL_ALL); /* init the curl session */ curl_handle = curl_easy_init(); /* set URL to get here */ curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]); /* Switch on full protocol/debug output while testing */ curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); /* disable progress meter, set to 0L to enable and disable debug output */ curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L); /* send all data to this function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); /* open the file */ pagefile = fopen(pagefilename, "wb"); if (pagefile) { /* write the page body to this file handle */ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile); /* get it! */ curl_easy_perform(curl_handle); /* close the header file */ fclose(pagefile); } /* cleanup curl stuff */ curl_easy_cleanup(curl_handle); return 0; }
时间: 2024-10-29 10:48:34