【问题标题】:How to download a ZIP file from server using cURL in C?如何在 C 中使用 cURL 从服务器下载 ZIP 文件?
【发布时间】:2014-08-28 04:05:53
【问题描述】:

我正在 Linux 平台上开发。我正在使用libcurl 并且能够receive json response 并将其保存到文件中。下面是代码。

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string.h>

#define URL "http://www.joes-hardware.com/tools.html"
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    //const char url[] = "http://www.joes-hardware.com/tools.html";

    char *url= URL;
    char outfilename[FILENAME_MAX] = "./json";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename,"wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

现在我需要从服务器获取一个zip 文件。假设URL 的格式如下所示:

#define URL "https://Server/File.zip"

对于此类 URL,代码无法保存 zip 文件。

如何做到这一点?

【问题讨论】:

  • 您是否检查过您在此列表中调用的 每个 api 的结果代码,看看它们是否有任何失败?特别是fopencurl_easy_perform,但all 并不是一个坏主意。 https url 的设置可能比简单的 pull 复杂得多。 see this.
  • @WhozCraig Ya 该代码对于http 请求说..."http://www.joes-hardware.com/tools.html".. 它保存对相应文件的json 响应.. 但请求https://Server/File.zip 没有保存

标签: c curl download zip


【解决方案1】:

我解决了这个问题。问题在于 HTTPS 连接。我必须为 HTTPS 添加证书。

基于以下链接:

#define CURL_STATICLIB
#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string.h>
#include <stdlib.h>

#define false 0

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;

    const char url[] = "https://example.com/filename.zip";
    const char outfilename[FILENAME_MAX] = "./json.zip";

    curl_version_info_data * vinfo = curl_version_info(CURLVERSION_NOW);

    if(vinfo->features & CURL_VERSION_SSL){
        printf("CURL: SSL enabled\n");
    }else{
        printf("CURL: SSL not enabled\n");
    }

    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename,"wb");        

        /* Setup the https:// verification options. Note we   */
        /* do this on all requests as there may be a redirect */
        /* from http to https and we still want to verify     */
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_CAINFO, "./ca-bundle.crt");
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);

        int i=fclose(fp);
        if( i==0)
        system("unzip -j json.zip");
    }
    return 0;
}

【讨论】:

  • 我想知道为什么这对 DropBox 和 Google Driver 公共链接都不起作用。您有什么想法吗?
  • curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); 是个坏主意。您应该修复您的证书和/或链问题。另请参阅CURLOPT_SSL_VERIFYHOST 的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2013-03-07
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多