0

我正在使用为 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 协议的示例。

我做对了吗?

4

0 回答 0