cpp libcurl отправляет zip-файл в http post-вызове без использования multipart \ form-data - PullRequest
0 голосов
/ 08 октября 2019

Мы использовали formdata в cpp libcurl для отправки данных на наш сервер, используя следующий код:

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-данные. Я нашел команду curl для присоединения zipfile без использования multipart \ form-data следующим образом

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

, но я не могу найти ее эквивалент в cpp curl. Наше требование - загрузить zip-файл в запросе http

.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Я использовал POST_FIELDS для загрузки zip-файла. Прочитайте zip-файл в двоичном режиме в указатель на символ и передайте его следующим образом:

    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);

Пожалуйста, исправьте меня, если я ошибаюсь, или предложите мне альтернативу

0 голосов
/ 08 октября 2019

Вам необходимо установить параметры CURLOPT_READDATA и CURLOPT_READFUNCTION. Curl будет повторно вызывать CURLOPT_READFUNCTION с тем, что вы передадите как CURLOPT_READDATA в качестве аргумента, пока не вернет 0 или CURL_READFUNC_ABORT.

По умолчанию libcurl предполагает, что ваши READFUNCTION считываются из дескриптора файла. Документация показывает следующий пример:

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 разбивает каждый вызовпока он не достигнет конца буфера в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...