【问题标题】:Downloading a file to Ubuntu with libcurl C++, simple example doesn't work使用 libcurl C++ 将文件下载到 Ubuntu,简单示例不起作用
【发布时间】:2019-08-13 17:38:16
【问题描述】:

我正在尝试使用带有 C++ 的 libcurl 将单个图像文件下载到我的 Ubuntu 机器上。

我尝试复制并粘贴此问题中显示的简单示例:Download file using libcurl in C/C++

#include <stdio.h>
#include <curl/curl.h>
#include <string>

using namespace std;

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

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    const char *url = "https://i.imgur.com/mWj0yzI.jpg";
    char outfilename[FILENAME_MAX] = "/home/my_username/test.jpg";
    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);
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

我希望它下载图像文件并将其保存为“test.jpg”在我的机器上。但是,当我运行这个程序时,“test.jpg”的大小是 0 字节。显然图像由于某种原因没有写入文件。

我做错了什么?

【问题讨论】:

  • 你需要对res 做一些事情——目前你不知道你的代码为什么会失败,使用 curl_easy_perform 的返回值开始诊断。如果 curl init 失败也一样 - 您不会打印任何诊断信息。
  • 你确定fopen 成功了吗?更仔细地研究libcurl(和fwrite)的文档并阅读How to debug small programs。考虑使用fflush
  • 感谢您的建议,我在存储res 之后添加了行cout &lt;&lt; curl_easy_strerror(res) &lt;&lt; endl;,它说No error。但是,我不确定应该如何诊断 init。
  • 我在清理步骤之前添加了fflush(fp);,行为没有改变。
  • 考虑使用调试器逐行单步执行您的代码。另见:stackoverflow.com/q/25385173/5910058

标签: c++ ubuntu download libcurl


【解决方案1】:

您的链接未指向现有文件。通过正确的链接,它对我有用。试试这个:

const char *url = "https://i.imgur.com/oRtvmGT.jpg";

【讨论】:

  • 谢谢,这成功了!多么奇怪;当我将自己代码中的链接复制并粘贴到浏览器中时,确实会出现图像。你知道为什么 C++ 认为文件不存在吗?
  • 当我转到链接时,我被重定向到https://i.imgur.com/removed.png,这是一张图片。我猜 curl 不会让自己被重定向到不同的文件并下载它,从安全的角度来看,这可能是一件好事。 :)
  • 啊,我想通了!我的浏览器已将图像保存在缓存中,所以当我转到链接时,我得到了旧图像。转到隐身链接确实给了removed.png ...在我第一次访问它并尝试下载它之间的一两分钟内删除图像是多么令人烦恼:P
猜你喜欢
  • 2010-12-13
  • 2010-12-10
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2019-03-19
  • 2012-07-01
相关资源
最近更新 更多