从保管箱通过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】:“我想我必须替换一些东西,但我不知道是什么”:将 <ACCESS_TOKEN>
替换为您的实际访问令牌。
您还应该将“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下载文件的主要内容,如果未能解决你的问题,请参考以下文章