【问题标题】:cpp libcurl send zip file in http post call without using multipart\form-datacpp libcurl 在 http post 调用中发送 zip 文件而不使用 multipart\form-data
【发布时间】:2020-02-05 10:21:34
【问题描述】:

我们在 cpp libcurl 中使用 formdata 使用以下代码将数据发送到我们的服务器:

curl_formadd(&form, &lastptr, CURLFORM_COPYNAME, "file", CURLFORM_FILE, filePath.c_str(), CURLFORM_END);

curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, form); 

但现在我们的服务器已经更新为接受 http 请求正文中的二进制文件而不是 multipart\form-data。我发现 curl 命令可以在不使用 multipart\form-data 的情况下附加 zipfile,如下所示

curl --request POST --data-binary "@file" $URL

但我在 cpp curl 中找不到它的等价物。我们的要求是在http请求中上传一个zipfile

【问题讨论】:

    标签: c++ upload multipartform-data libcurl zipfile


    【解决方案1】:

    您需要设置CURLOPT_READDATACURLOPT_READFUNCTION 选项。 Curl 将反复调用 CURLOPT_READFUNCTION,并将您传递为 CURLOPT_READDATA 的任何内容作为参数,直到它返回 0 或 CURL_READFUNC_ABORT

    默认情况下,libcurl 假定您的 READFUNCTION 从文件句柄中读取。 documentation 显示以下示例:

    size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
    {
      FILE *readhere = (FILE *)userdata;
      curl_off_t nread;
    
      /* copy as much data as possible into the 'ptr' buffer, but no more than
         'size' * 'nmemb' bytes! */
      size_t retcode = fread(ptr, size, nmemb, readhere);
    
      nread = (curl_off_t)retcode;
    
      fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
              " bytes from file\n", nread);
      return retcode;
    }
    
    void setup(char *uploadthis)
    {
      FILE *file = fopen("rb", uploadthis);
      CURLcode result;
    
      /* set callback to use */
      curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    
      /* pass in suitable argument to callback */
      curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);
    
      result = curl_easy_perform(curl);
    }
    

    如果您想从内存缓冲区中读取数据,则您的 READFUNCTION 需要记住某处的偏移量并 memcpy 对每次调用进行分块,直到它到达内存缓冲区的末尾。

    【讨论】:

    • 您好,感谢您的帮助。但是,我已经试过了,还是不行。
    • “不工作”是什么意思?请求没有到达吗?这不是一个帖子吗?你的代码是什么样的?
    • 它没有到达服务器
    • 我正在尝试这样的事情:``` curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, "name=@"+filePath); ```
    • 您在documentation 的哪个位置看到支持此语法?此外,这仍然会发送一个application/x-www-form-urlencoded HTTP 正文。您确定这是 API 所期望的,而不是 application/zip 或类似类型的原始帖子吗?
    【解决方案2】:

    我使用 POST_FIELDS 上传了一个 zip 文件。将二进制模式的 zip 文件读入一个 char 指针,然后像这样传递给它:

        char * buffer;
        //read file into buffer
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)total);
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, buffer);
    

    如果我错了,请纠正我或建议我替代

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 2014-10-18
      • 2016-06-13
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多