c - 使用 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 等等。无论如何我可以实现这种流式传输吗?
任何建议都非常感谢。谢谢。
解决方案
我想出了下面的方法来实现我的要求。
文件流可以使用 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 下载文件的其他应用程序填充。
我希望它可以帮助某人。
推荐阅读
- java - JBehave空上下文
- xcode10 - 使用 Xcode10.1 归档应用程序自动自动签名无法解决“”目标的权利问题
- javascript - 检查下拉元素是否存在querySelector?
- python - 如何在 Plotly 美国飞行地图示例中根据航空公司更改颜色
- c# - 根据当前时间更改标签
- html - 在 a 下面添加垂直空间
element in a table
- c++ - nm符号“U”和“T”,这是什么意思?
- sharepoint - 使用 PowerShell 在 SharePoint 中检查术语名称时出现与号问题
- react-admin - 无法让 react-admin 在内部工作
标记(包括 React-Admin 在另一个 Redux 应用程序中) - c++ - How can I refresh the console in the most efficient way? (snake game c++)