Я пытаюсь загрузить файл в anonfile в C, используя библиотеки win inet.
В соответствии с их API , нам нужно отправить запрос POST HTTP с указанием файл по следующему URL:
https://api.anonfile.com/upload
Кроме того, я загрузил один файл с CURL, чтобы увидеть сгенерированные заголовки: https://pastebin.com/VZfhaxEy
Таким образом, мой функция выглядит так ( на основе этого поста ). Обратите внимание, что он по-прежнему не обрабатывает ответ сервера, только отправку:
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#pragma comment(lib,"Wininet.lib") //Library
#define ERROR_OPEN_FILE 10
#define ERROR_MEMORY 11
#define ERROR_SIZE 12
#define ERROR_INTERNET_OPEN 13
#define ERROR_INTERNET_CONN 14
#define ERROR_INTERNET_REQ 15
#define ERROR_INTERNET_SEND 16
int main(int argc, char* argv[])
{
// Local variables
char* filename = "C:\\test.zip"; //Filename to be loaded
char* type = "binary";
char boundary[] = "pippo"; //Header boundary
char nameForm[] = "upload"; //Input form name
char iaddr[] = "api.anonfile.com"; //IP address
char url[] = "upload"; //URL
char hdrs[1024]; //Headers
char* buffer; //Buffer containing file + headers
char* content; //Buffer containing file
FILE* pFile; //File pointer
long lSize; //File size
HRESULT result;
// Open file
fopen_s(&pFile, filename, "rb");
if (pFile == NULL) return ERROR_OPEN_FILE;
// obtain file size:
fseek(pFile, 0, SEEK_END);
lSize = ftell(pFile);
rewind(pFile);
// allocate memory to contain the whole file:
content = (char*)malloc(sizeof(char) * lSize);
if (content == NULL) return ERROR_MEMORY;
// copy the file into the buffer:
result = fread(content, 1, lSize, pFile);
if (result != lSize) return ERROR_SIZE;
// terminate
fclose(pFile);
//allocate memory to contain the whole file + HEADER
buffer = (char*)malloc(sizeof(char) * lSize + 2048);
//print header
sprintf_s(hdrs,
1024,
"POST /upload HTTP/2\r\n"
"Host: api.anonfile.com\r\n"
"User-Agent: curl/7.60.0"
"cache-control: no-cache\r\n"
"content-type: multipart/form-data\r\n"
"name=\"%s\"; filename=\"%s\"\r\n"
"Content-Length: %i\r\n"
"Accept: */*\r\n"
"\n", nameForm, filename, lSize);
//Open internet connection
HINTERNET hSession = InternetOpen("WinSock", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession == NULL) return ERROR_INTERNET_OPEN;
HINTERNET hConnect = InternetConnect(hSession, iaddr, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
if (hConnect == NULL) {
printf("%d", GetLastError());
return ERROR_INTERNET_CONN;
}
HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST", url, NULL, NULL, (const char**)"*/*\0", 0, 1);
if (hRequest == NULL) {
printf("%d", GetLastError());
return ERROR_INTERNET_REQ;
}
BOOL sent = HttpSendRequest(hRequest, hdrs, strlen(hdrs), buffer, strlen(buffer));
if (!sent) {
printf("%d", GetLastError());
return ERROR_INTERNET_SEND;
}
//close any valid internet-handles
InternetCloseHandle(hSession);
InternetCloseHandle(hConnect);
InternetCloseHandle(hRequest);
return 0;
}
Но каким-то образом он не может выполнить соединение:
123
(process 7652) exited with code 14. (ERROR_INTERNET_CONN).
Чего мне не хватает?
Вот единственный пример загрузки файла без файла, который я нашел , но он использует curl и находится в C ++.