我正在使用为 VC17 X64 机器构建的 curl-7.62.0 来开发文件上传实用程序。文件上传器将文件上传到网络驱动器。curl 构建目录有一个.exe
和一个.dll
文件
我能够从 Windows shell 运行此命令,并且能够成功地将文件上传到网络驱动器。
<path_to_curl>\bin\curl --upload-file C:\file.txt file:////<ip_address>/ShareDrive/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1403 0 0 100 1403 0 87687 --:--:-- --:--:-- --:--:-- 87687
现在我想以编程方式实现相同的目标,并且我正在用 C++ 编写我的组件。我有一个上传功能如下:
int Uploader::upload(const std::string& url) {
CURLcode res;
FILE *hd_src;
struct stat file_info;
curl_off_t fsize;
if (stat(LOCAL_FILE, &file_info)) {
printf("Couldnt open '%s': %s\n", LOCAL_FILE, strerror(errno));
return -1;
}
fsize = (curl_off_t)file_info.st_size;
printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize);
hd_src = fopen(LOCAL_FILE, "rb");
curl_global_init(CURL_GLOBAL_ALL);
curl_ = curl_easy_init();
if (curl_) {
curl_easy_setopt(curl_, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_, CURLOPT_READDATA, hd_src);
curl_easy_setopt(curl_, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(curl_, CURLOPT_INFILESIZE_LARGE,
(curl_off_t)fsize);
res = curl_easy_perform(curl_);
}
fclose(hd_src);
return 0;
}
我的回调在全球范围内:
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
printf("Called...\n");
size_t retcode = fread(ptr, size, nmemb, (FILE*)stream);
printf("*** We read %lld bytes from file\n", retcode);
return retcode;
}
我的主要看起来像这样:
int main(int argc, char** argv) {
Uploader uploader;
uploader.upload("file:////<ip_address>/ShareDrive/");
}
控件根本不会转到回调方法,因此上传永远不会发生。CURL 是否支持 FILE 协议?我可以看到 FTPUpload、HTTPupload 的示例,但在 Windows 上没有 FILE 协议的示例。
我做对了吗?