我們使用libcurl C API來通過 SFTP 發送檔案。使用這樣的代碼可以正常作業:
....
fd = fopen(local_file_full_path.c_str(), "rb");
if (!fd)
{
cout << "Error opening local file: " << local_file_full_path << endl;
return -1;
}
curl_easy_setopt(curl_easy_handle, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl_easy_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl_easy_handle, CURLOPT_READDATA, fd);
curl_easy_setopt(curl_easy_handle, CURLOPT_HTTPHEADER, headerList);
然而,這意味著即使我們有可用的資料 - 我們必須將它們寫入檔案,然后傳遞檔案。
我想知道是否libcurl提供了一個選項,我們可以在其中傳遞資料流,例如指向資料結構的指標。如果是這樣的話,有什么我可以使用的例子嗎?這是否意味著需要在“接收方”端進行更改——因為我們不擁有它。
uj5u.com熱心網友回復:
您已經擁有解決方案的 1/2 - CURLOPT_READDATA。您只需要將它與CURLOPT_READFUNCTION中的自定義回呼配對,然后您可以傳遞一個指向現有資料的指標,CURLOPT_READDATA并在需要資料時讓您的回呼將該資料復制到 libcurl 的緩沖區中。
當 libcurl 需要讀取資料以將其發送到對等方時,該回呼函式就會被呼叫 - 就像您要求它向服務器上傳或發布資料一樣。指標指向的資料區域
buffer最多應該被 你的函式size乘以nitems位元組數來填充。
userdata使用 CURLOPT_READDATA 選項設定 引數。
uj5u.com熱心網友回復:
如果您使用的是 POSIX 系統,則可以使用fmemopen():
概要
#include <stdio.h> FILE *fmemopen(void *restrict buf, size_t size, const char *restrict mode);描述
該
fmemopen()函式應將由buf和size引數給定的緩沖區與流相關聯。buf引數應為空指標或指向至少為size位元組長的緩沖區。
假設您有適當型別的 abuffer和bytes變數,您的代碼將如下所示:
fd = fmemopen(buffer, bytes, "rb");
if (!fd)
{
cout << "Error opening local file: " << local_file_full_path << endl;
return -1;
}
curl_easy_setopt(curl_easy_handle, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl_easy_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl_easy_handle, CURLOPT_READDATA, fd);
curl_easy_setopt(curl_easy_handle, CURLOPT_HTTPHEADER, headerList);
如果您在 Windows 上運行,請參閱C - 在記憶體中創建檔案。它專門解決了如何fmemopen()在 Windows 上實作的功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467405.html
