Sunday, March 27, 2011

Is there any good example of http upload using WinInet c++ library

I cannot get my code to work :/

From stackoverflow
  • Here's a quick example from Microsoft.

       static TCHAR hdrs[] =
          _T("Content-Type: application/x-www-form-urlencoded");
       static TCHAR frmdata[] =
          _T("name=John+Doe&userid=hithere&other=P%26Q");
      static LPSTR accept[2]={"*/*", NULL};
    
       // for clarity, error-checking has been removed
       HINTERNET hSession = InternetOpen("MyAgent",
          INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
       HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
          INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
       HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
          _T("FormActionHere"), NULL, NULL, accept, 0, 1);
       HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
       // close any valid internet-handles
    

    The example comes from here.

    michael : Thanx, but I still don't understand how can I upload a file (image) with that, how do I add image binaries to the POST body I thin it should contain multipart body, but how :/
  • Eventually I found some working example on the web

    static char szRawData[5000];
      memset(szRawData, 0x11, sizeof(szRawData));
    
      //
      // CIHandle is just a wrapper class for HINTERNET, that closes handle in destructor
      //
      CIHandle hIntrn = InternetOpen( "LiveUpdate"), 
                                      INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
                                      NULL,
                                      NULL,
                                      0);
      if (!hIntrn)
        return printf("No Internet connection: %li.\n", GetLastError());
    
      CIHandle hConn = InternetConnect( hIntrn, 
                                        "65.254.250.104",
                                        INTERNET_DEFAULT_HTTP_PORT,
                                        NULL,
                                        NULL,
                                        INTERNET_SERVICE_HTTP,
                                        0,
                                        NULL);
      if (!hConn)
        return printf("Connection to update server failed: %li.\n", GetLastError());
    
      DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
                                 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
                                 INTERNET_FLAG_KEEP_CONNECTION |
                                 INTERNET_FLAG_NO_AUTO_REDIRECT |
                                 INTERNET_FLAG_NO_COOKIES |
                                 INTERNET_FLAG_NO_CACHE_WRITE |
                                 INTERNET_FLAG_NO_UI |
                                 INTERNET_FLAG_RELOAD;
    
      CIHandle hReq = HttpOpenRequest(hConn,
                                      "POST",
                                      "upload.php",
                                      "HTTP/1.0",
                                      NULL,
                                      NULL,
                                      dwOpenRequestFlags,
                                      NULL);
    
      ZString strBoundary = "---------------------------autoupdater";
      ZString strContentHeader =  "Host: www.mydomain_at_powweb.com\r\n"
                                  "Content-Type: multipart/form-data; boundary=";
      strContentHeader+=strBoundary;
    
      HttpAddRequestHeaders(hReq, strContentHeader, strContentHeader.length(), HTTP_ADDREQ_FLAG_ADD);
    
    
      ZString strHeaders;
      strHeaders.precache(16384);
      sprintf(strHeaders,
              "--%s\r\n"
              "Content-Disposition: form-data; name=\"userfile\"; "
              "filename=\"test.raw\"\r\n"
              "Content-Type: application/octet-stream\r\n\r\n",
              (LPCTSTR)strBoundary);
    
      tCharSeq s;//this is a just a dynamic array of bytes;
      //
      // append headers and file to request:
      //
      s.precache(16384);
      s.append(strHeaders.length(), strHeaders);
      //append with file data:
      s.append(2000, szRawData); //<------------------- depending on this size, SendRequest fails.
      //trailing end of data:
      s.append(4,"\r\n--");
      s.append(strBoundary.length(), (LPTSTR)strBoundary);
      s.append(4,"--\r\n");
    
      InternetSetOption(hReq, INTERNET_OPTION_USERNAME, "username\0", 9);
      InternetSetOption(hReq, INTERNET_OPTION_PASSWORD, "password\0", 9);
    
      if (!HttpSendRequest(hReq, NULL, 0, (void*)s.getBuffer(), s.length()))
        return printf("HttpSendRequest failed: %li.\n", GetLastError());
    

0 comments:

Post a Comment