@p3trukh1n
NooB IN WeB

Как загрузить файл на сервер не используя cURL?

Необходимо загрузить файл на сервер, не используя cURL, потому что я ориентирован на низкий вес программы. Как можно это сделать?
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
SerJook
@SerJook
кодер
Если размер файла не очень большой, можно попробовать с помощью WinInet:

КОД
#include <windows.h>
#include <wininet.h>
#include <fstream>
#include <sstream>
#include <iostream>
#pragma comment(lib,"wininet.lib")

int main(int argc, char* argv[])
{
    // инициализируем WinInet
    HINTERNET hInternet = ::InternetOpen(TEXT("WinInet Test"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

    if (hInternet != NULL) {
        // открываем HTTP сессию
        HINTERNET hConnect = ::InternetConnect(hInternet, TEXT("localhost"), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL,
                                                INTERNET_SERVICE_HTTP, 0, 1u);

        if (hConnect != NULL) {
            // открываем запрос
            HINTERNET hRequest = ::HttpOpenRequest(hConnect, TEXT("POST"), TEXT("test.php"), NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 1);

            if (hRequest != NULL) {
                // посылаем запрос
                std::string fileName = "c:\\test.png"; // путь к файлу
                char hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";
                std::string frmdata = "-----------------------------7d82751e2bc0858\r\n";
                // В этой строке "uploadedfile" - название поля формы
                frmdata += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + fileName + "\"\r\nContent-Type: application/octet-stream\r\n\r\n";
                std::ostringstream ostrm;
                std::ifstream fin(fileName, std::ios::binary);
                if (fin) {
                    ostrm << fin.rdbuf();

                    frmdata.append(ostrm.str());
                    frmdata += "\r\n-----------------------------7d82751e2bc0858--\r\n";

                    BOOL bSend = ::HttpSendRequestA(hRequest, hdrs, strlen(hdrs), &frmdata[0], frmdata.size());
                    if (bSend) {
                        std::string res; // В этой переменной будет ответ сервера
                        for (;;) {
                            // читаем данные
                            char szData[1024];
                            DWORD dwBytesRead;
                            BOOL bRead = ::InternetReadFile(hRequest, szData, sizeof(szData) - 1, &dwBytesRead);

                            // выход из цикла при ошибке или завершении
                            if (bRead == FALSE || dwBytesRead == 0)
                                break;

                            // сохраняем результат
                            szData[dwBytesRead] = 0;
                            res.append(szData);
                        }
                        std::cout << res;
                    }
                }
                // закрываем запрос
                ::InternetCloseHandle(hRequest);
            }
            // закрываем сессию
            ::InternetCloseHandle(hConnect);
        }
        // закрываем WinInet
        ::InternetCloseHandle(hInternet);
    }

    return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы