POST загрузить двоичный файл с wininet на c ++

Я получил этот пример загрузки файла через POST для работы с файлом .txt. Однако мне все еще не хватает способа сделать то же самое с двоичным файлом.

Может кто-нибудь показать, как это сделать? Я просмотрел около 100 страниц в Интернете, где люди задают этот ОЧЕНЬ ЖЕ вопрос ... Многие из этих вопросов находятся на этом сайте, но ни у одного нет хорошего ответа. У Codeproject есть несколько способов, но они, похоже, основаны на MFC / ATL, и я не могу их использовать.

Этот вопрос кажется безумно сложным. : D Так что пожалуйста, кто-нибудь, ответьте, пожалуйста, хорошенько. Вы окажете мне и многим другим услугу. :)


person user1412386    schedule 06.07.2012    source источник
comment
Выгрузка двоичного файла из браузера затруднительна ... из C вы просто помещаете двоичные данные после двух символов новой строки, следующих за заголовками HTTP. В примере, который вы связали, Content-Type установлен на image/jpeg, что является двоичным форматом ... что не работает или вы? Кроме того, multipart/form-data может излишне усложнять ситуацию. В какую службу вы загружаете?   -  person Potatoswatter    schedule 06.07.2012
comment
Вы контролируете серверную часть? Если нет, то каков ожидаемый тип данных MIME - форма или составная часть? И что такого особенного в двоичных файлах по сравнению с текстовыми - вы просто не знаете, как кодировать байты, отличные от ASCII?   -  person Seva Alekseyev    schedule 06.07.2012
comment
Загрузка через базовую HTML-форму, например tizag.com/phpT/fileupload.php на платформе php. Когда я пытаюсь загрузить изображение с помощью этого сценария, изображение проходит, но размер изображения составляет всего 4 байта (iirc), поэтому я думаю, что моя проблема в том, что я не могу обрабатывать байты, отличные от ASCII? : D   -  person user1412386    schedule 07.07.2012
comment
Возможный дубликат http://stackoverflow.com/questions/471198/is-there-any-good-example-of-http-upload-using-wininet-c-library   -  person J. Chomel    schedule 12.07.2016
comment
Похоже, ребята отправили необработанные данные в этом примере   -  person J. Chomel    schedule 12.07.2016


Ответы (1)


Приведенный ниже код загрузит файл: 1.jpg на указанный хост с помощью метода wininet и простого HTTP-запроса POST.

(name=johndoe and document=1.jpg)

#include<windows.h>
#include<wininet.h>
#include<iostream>

using namespace std;

DWORD rSize,filesize,bytesread,contentlen;

char tmp[2048]; //2Kb Response buffer
char szheaders[1024]; //1kb Header buffer
string chunks; //Server Response

HANDLE hfile;
HINTERNET hOpen2,hConnect2,hReq2;

char szstart[] = "Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468\r\nUser-Agent: Mozilla";
char szData[]    = "---------------------------acebdf13572468\r\nContent-Disposition: form-data; name=\"firstname\"\r\n\r\njohndoe\r\n---------------------------acebdf13572468\r\nContent-Disposition: form-data; name=\"document\"; filename=\"1.jpg\"\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n\r\n";
char szDataEnd[] = "\r\n---------------------------acebdf13572468--\r\n";

int main()
{

    hfile=CreateFile("1.jpg",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);

    if(hfile != INVALID_HANDLE_VALUE){

    wsprintf(szheaders,szData,"filetoupload","1.jpg");
    hOpen2=InternetOpen(TEXT("Mozilla/5.0"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if(hOpen2){
        hConnect2=InternetConnect(hOpen2, TEXT("www.example.com"), INTERNET_DEFAULT_HTTPS_PORT, TEXT(""), TEXT(""), INTERNET_SERVICE_HTTP, 0, 0);
        if(hConnect2){

           hReq2=HttpOpenRequest(hConnect2, TEXT("POST"), TEXT("/your_path/index.php"), TEXT("HTTP/1.1"),NULL,NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_IGNORE_CERT_CN_INVALID |INTERNET_FLAG_IGNORE_CERT_DATE_INVALID, 0);
           if(hReq2){

                filesize=GetFileSize(hfile,NULL);
                contentlen=lstrlen(szheaders)+filesize+lstrlen(szDataEnd);

                LPBYTE pbuf=(LPBYTE)malloc(contentlen);
                CopyMemory(&pbuf[0],szheaders,lstrlen(szheaders));

                ReadFile(hfile,&pbuf[lstrlen(szheaders)],filesize,&bytesread,NULL);
                CopyMemory(&pbuf[lstrlen(szheaders)+filesize],szDataEnd,lstrlen(szDataEnd));

                BOOL status =  HttpSendRequest(hReq2,szstart,lstrlen(szstart),pbuf,contentlen);
                if (status){
                    chunks="";
                    while(InternetReadFile(hReq2, tmp, 2048, &rSize) && rSize > 0)
                    {
                        tmp[rSize] = '\0';
                        chunks += tmp;
                    }
                    cout << chunks;
                    //Prints Server response
                }
                    CloseHandle(hfile);
                    free(pbuf);
            } 
            InternetCloseHandle(hReq2);
        }
        InternetCloseHandle(hConnect2);
    }
    InternetCloseHandle(hOpen2);
    }

}
 

g++ test.cpp -o test.exe -lwininet

person A5H1Q    schedule 11.03.2021