从保管箱通过c ++中的curl下载文件

Posted

技术标签:

【中文标题】从保管箱通过c ++中的curl下载文件【英文标题】:Downloading a file via curl in c++ from dropbox 【发布时间】:2019-09-10 10:02:02 【问题描述】:

我想在 c++ 程序中使用 curl 从 Dropbox 共享链接下载文件

我找到了一个 Dropbox api pdf,它向我展示了如何操作

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

int main (int argc, char *argv[])

     CURL *curl;
     CURLcode res;
     /* In windows, this will init the winsock stuff */
     curl_global_init(CURL_GLOBAL_ALL);
     /* get a curl handle */
     curl = curl_easy_init();
     if(curl) 
     printf ("Running curl test.\n");
     struct curl_slist *headers=NULL; /* init to NULL is important */
     headers = curl_slist_append(headers, "Authorization: Bearer 
     <ACCESS_TOKEN>");
     headers = curl_slist_append(headers, "Content-Type:");
     headers = curl_slist_append(headers, "Dropbox-API-Arg: 
     \"path\":\"/test.txt\"");
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_URL,
    "https://content.dropboxapi.com/2/files/download");
     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "");
     /* Perform the request, res will get the return code */
     res = curl_easy_perform(curl);
     /* Check for errors */
     if(res != CURLE_OK)
        fprintf(stderr, "curl_easy_perform() failed: %s\n",

     curl_easy_strerror(res));
    /* always cleanup */
    curl_easy_cleanup(curl);
    printf ("\nFinished curl test.\n");
    
          curl_global_cleanup();
         printf ("Done!\n");
           return 0;
         

但是,提供的 cmets 并没有为我提供太多解释,我无法让它工作。

这三行代码看不懂:

headers = curl_slist_append(headers, "Authorization: Bearer <ACCESS_TOKEN>");

headers = curl_slist_append(headers, "Content-Type:");

headers = curl_slist_append(headers, "Dropbox-API-Arg:\"path\":\"/test.txt\"");

我想我必须更换一些东西,但我不知道是什么

【问题讨论】:

要下载的文件是什么网址,能分享一下吗 将所有凭据与此 ***.com/questions/29512884/… 匹配 是.exe文件 dropbox.com/s/zoyb6wcgzceuxyu/BankAccount.exe?raw=1 【参考方案1】:

“我想我必须替换一些东西,但我不知道是什么”:将 &lt;ACCESS_TOKEN&gt; 替换为您的实际访问令牌。

您还应该将“Content-Type:”标头设置为您要获取的数据的适当值。

您还必须更改“Dropbox-API-Arg”标头的值以匹配您尝试获取的文件。

【讨论】:

我有点不好意思问,但我不得不问,我的实际访问令牌应该是什么 @HBatalha 请参阅google.com/amp/s/blogs.dropbox.com/developers/2014/05/… 了解起点 谢谢,我已经为我的帐户生成了 access_token 现在在“Content-Type:”中,我应该用我要下载的日期类型替换吗?在我的情况下是一个 .exe 文件? 谢谢你@Jesper Juhl 我用谷歌搜索并找到了这个lifewire.com/file-extensions-and-mime-types-3469109 根据这个limk 内容类型是'application/octet-stream' 然而在这个*** 帖子***.com/questions/41459168/… 我发现它是“应用程序/vnd.microsoft.portable-executable” @HBatalha 我最初的猜测是可执行文件的“application/octet-stream”,但如果 dropbox 接受“application/vnd.microsoft.portable-executable”,那么我猜这也可以更具体。 “应用程序/八位字节流”是一种“后备”,因为它基本上是这样说的;给我原始字节。【参考方案2】:

我终于找到了解决问题的方法。

原来我不必使用 Dropbox API

这里是代码

#include <iostream>
#include <curl/curl.h>

using namespace std;

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(int argc, char** argv) 

CURL *curl;
FILE *fp;

const char* destination = "D:\\Desktop\\test.exe";

fp = fopen(destination, "wb");

curl = curl_easy_init();

/* A long parameter set to 1 tells the library to follow any Location: header 
 * that the server sends as part of an HTTP header in a 3xx response. The 
 *Location: header can specify a relative or an absolute URL to follow.
*/
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 

curl_easy_setopt(curl, CURLOPT_URL, "https://www.dropbox.com/s/09nd26tdyto23yz/BankAccount.exe?dl=1"); // "dl=0"changed to "dl=1" to force download

// disabe the SSL peer certificate verification allowing the program to download the file from dropbox shared link
// in case it is not used it displays an error message stating "SSL peer certificate or SSH remote key was not OK"
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

CURLcode res;

res = curl_easy_perform(curl);

curl_easy_cleanup(curl);

fclose(fp);


if (res ==CURLE_OK)
    cout << "OK";
else
    cout << curl_easy_strerror(res);

return 0;

感谢你们试图帮助我。我很感激

【讨论】:

以上是关于从保管箱通过c ++中的curl下载文件的主要内容,如果未能解决你的问题,请参考以下文章

使用Curl从firebase导出大型json数据的问题

使用 Octokit (c#, .net) 从大型 github 企业存储库中高效下载单个文件

从谷歌驱动器wget / curl大文件

通过c中的函数从文件中读取整数返回错误值

无法通过 api 从 ADO 下载 zip 文件

curl -L 通过 Alamofire for Swift 3 从 Box 获取文件内容