首页 > 解决方案 > 使用 libcurl 将文件流式传输到 HTTP 服务器

问题描述

我正在尝试开发一个 C 应用程序来在 HTTP 端点上上传文件。我从终端使用以下命令上传文件,效果很好,

curl -F file=@/filename.txt -O http://serveraddress/download

因为,我在 C 应用程序中需要它,所以我参考了https://curl.haxx.se/libcurl/c/postit2-formadd.html,它也可以正常工作。提供的文件正在成功上传。

我想以类似的方式上传文件,但文件不存在于本地存储中。该文件正在使用 Curl 下载到应用程序中。从一开始,我们就有将要下载的文件的大小。我想将该文件直接流式传输到上面的 HTTP 端点(多部分文件上传),因为我没有足够的本地存储来下载整个文件然后上传。文件--> CurlDownloadHandle-->Write() ----- Read()-->CurlUploadHandle---文件

我不确定如何使用 HTTPPOST、HTTPPOSTFILED 等等。无论如何我可以实现这种流式传输吗?

任何建议都非常感谢。谢谢。

标签: cfile-uploadmultipartform-datalibcurl

解决方案


我想出了下面的方法来实现我的要求。

文件流可以使用 curl_formadd(对于旧版本的 libcurl)和 curl_mime(对于较新版本 > 7.58.0)API 来实现。使用 Mime API:

CURL *curl_handle;
curl_mime *mime;
curl_mimepart *part;

mime = curl_mime_init(curl_handle);
part = curl_mime_addpart(mime);
curl_mime_name(part, "sendfile");
curl_mime_filename(part, "uploadfile.txt");
curl_mime_data_cb(part, file_size, read_buffer, NULL, NULL, NULL);

curl_easy_setopt(curl_handle, CURLOPT_URL, url);
curl_easy_setopt(curl_handle, CURLOPT_MIMEPOST, mime);
curl_easy_perform(curl_handle);

curl_mime_data_cb() 中给出的读取回调函数从缓冲区/队列中读取,此缓冲区/队列数据正在被使用 libcurl 下载文件的其他应用程序填充。

我希望它可以帮助某人。


推荐阅读