Это:
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, "uploadType=media");
совпадает с:
curl_easy_setopt(curl_handle, CURLOPT_READDATA, "uploadType=media");
curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, a_fucntion_that_reads_that_string);
Набор CURLOPT_POSTFIELDS
- это тело POST.Вы устанавливаете тело сообщения на uploadType=media
.Вы не хотите отправлять эту строку, вы хотите отправить файл.Строка uploadType=media
является частью URL, и вы должны просто добавить ее в URL.Google ответил с 404 не найден - URL /upload/drive/v3/files
является недействительным, должно быть /upload/drive/v3/files?uploadType=media
.
Вы должны установить правильный URL:
curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.googleapis.com/upload/drive/v3/files?uploadType=media");
удалить
// remove
// curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, "uploadType=media");
и просто прочитайте данные из FILE*
, используя CURLOPT_READDATA
.
Я остался со следующей программой (извините за беспорядок):
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
const char access_token[] = "Proceeding at three quarters impulse. Make it so, commander!";
int main() {
CURL * curl_handle = curl_easy_init();
struct stat file_info;
FILE *fd;
stat("grinch.jpg", &file_info);
printf("%zu\n", file_info.st_size);
/* get a FILE * of the image */
fd = fopen("grinch.jpg", "rb");
if (fd == NULL) {
abort();
}
struct curl_slist *chunk = NULL;
/* Content-Type: image/jpeg */
chunk = curl_slist_append(chunk, "Content-Type: image/jpeg");
/* Content-Length: [NUMBER_OF_BYTES_IN_FILE] */
char size[200];
snprintf(size, 200, "Content-Length: %lld", (long long int)file_info.st_size);
chunk = curl_slist_append(chunk, size);
/* Authorization: Bearer [YOUR_AUTH_TOKEN] */
char auth[300];
strcat(auth, "Authorization: Bearer ");
strcat(auth, access_token);
chunk = curl_slist_append(chunk, auth);
curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.googleapis.com/upload/drive/v3/files?uploadType=media");
curl_easy_setopt(curl_handle, CURLOPT_POST, 1L);
curl_easy_setopt(curl_handle, CURLOPT_READDATA, fd);
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
CURLcode res = curl_easy_perform(curl_handle);
/* Print response */
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
else {
printf(" SUCCESS \n");
}
curl_easy_cleanup(curl_handle);
curl_global_cleanup();
}
Для запросаЯ получаю ответ:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Но, скорее всего, мои учетные данные плохие;).