title: Upload Image File in C++
body: <p>I am new to C++ environment. I try to upload a image file to PHP server in C++. But it does not send the full file. Only I get uploaded image file size is 1 KB. </p>
  
  <p>I got a post in SO like mine. But I don't know how to convert image binary to base64 string. I tried with another solution memcpy, it also doesn't work.</p>
  
  <p><a href="https://stackoverflow.com/questions/5309661/upload-file-via-post">Upload file via POST</a></p>
  
  <p>My C++ Code:   </p>
  
  <pre><code>#define _CRT_SECURE_NO_DEPRECATE
  #include &lt;iostream&gt;
  #include &lt;tchar.h&gt;
  #include &lt;Urlmon.h&gt;
  #pragma comment (lib, "Urlmon.lib")
  
  #include &lt;windows.h&gt;
  #include &lt;wininet.h&gt;
  #include &lt;iostream&gt;
  #include &lt;tchar.h&gt;
  #include &lt;stdio.h&gt;
  
  #pragma comment(lib,"wininet.lib")
  #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
  
  using namespace cv;
  using namespace std;
  
  int main()
  {
      // Local variables
      static char *filename = "test.jpg";   //Filename to be loaded
      static char *filepath = "test.jpg";   //Filename to be loaded
      static char *type = "text/jpeg";
      static TCHAR hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";
      static char boundary[] = "-----------------------------7d82751e2bc0858";            //Header boundary
      static char nameForm[] = "uploadedfile";     //Input form name
      static char iaddr[] = "server";        //IP address
      static char url[] = "uploader.php";
  
      char * buffer;                   //Buffer containing file + headers
      char * content;                  //Buffer containing file
      FILE * pFile;                    //File pointer
      long lSize;                      //File size
      size_t result;
      char *pos; // used in the loop
  
      // Open file
      pFile = fopen(filepath, "rb");
      if (pFile == NULL)
      {
          printf("ERROR_OPEN_FILE");
          getchar();
          return ERROR_OPEN_FILE;
      }
      printf("OPEN_FILE\n");
  
      // 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)
      {
          printf("ERROR_MEMORY");
          getchar();
          return ERROR_OPEN_FILE;
      }
  
      printf("MEMORY_ALLOCATED\t \"%d\" \n", lSize);
      // copy the file into the buffer:
      result = fread(content, 1, lSize, pFile);
  
      rewind (pFile);
  
      if (result != lSize)
      {
          printf("ERROR_SIZE");
          getchar();
          return ERROR_OPEN_FILE;
      }
      printf("SIZE_OK\n");
  
      // terminate
      fclose(pFile);
      printf("FILE_CLOSE\n");
      //allocate memory to contain the whole file + HEADER
      buffer = (char*)malloc(sizeof(char)*lSize + 2048);
  
      //print header
      sprintf(buffer, "%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n", boundary, nameForm, filename);
      sprintf(buffer, "%sContent-Type: %s\r\n", buffer, type);
      //sprintf(buffer, "%sContent-Length: %d\r\n", buffer, lSize);
      sprintf(buffer, "%s\r\n%s\r\n", buffer, content);
  
      /**
      sprintf(buffer, "%s\r\n", buffer);
      memcpy(buffer + strlen(buffer),content,lSize);
      sprintf(buffer, "%s\r\n", buffer);
      */
      sprintf(buffer, "%s%s--\r\n", buffer, boundary);
  
      //Open internet connection
      HINTERNET hSession = InternetOpen("WINDOWS", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
      if (hSession == NULL)
      {
          printf("ERROR_INTERNET_OPEN");
          getchar();
          return ERROR_OPEN_FILE;
      }
      printf("INTERNET_OPENED\n");
  
      HINTERNET hConnect = InternetConnect(hSession, iaddr, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
      if (hConnect == NULL)
      {
          printf("ERROR_INTERNET_CONN");
          getchar();
          return ERROR_INTERNET_CONN;
      }
      printf("INTERNET_CONNECTED\n");
  
      HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST", _T(url), NULL, NULL, NULL, INTERNET_FLAG_RELOAD, 1);
      if (hRequest == NULL)
      {
          printf("ERROR_INTERNET_REQ");
          getchar();
  
      }
      printf("INTERNET_REQ_OPEN\n");
  
      BOOL sent = HttpSendRequest(hRequest, hdrs, strlen(hdrs), buffer, strlen(buffer));
  
      if (!sent)
      {
          printf("ERROR_INTERNET_SEND");
          getchar();
          return ERROR_INTERNET_CONN;
      }
      printf("INTERNET_SEND_OK\n");
      printf("\r\n%s\r\n",buffer);
  
      //close any valid internet-handles
      InternetCloseHandle(hSession);
      InternetCloseHandle(hConnect);
      InternetCloseHandle(hRequest);
  }
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>OPEN_FILE
  MEMORY_ALLOCATED     "44358" 
  SIZE_OK
  FILE_CLOSE
  INTERNET_OPENED
  INTERNET_CONNECTED
  INTERNET_REQ_OPEN
  INTERNET_SEND_OK
  
  
  -----------------------------7d82751e2bc0858
  
  Content-Disposition: form-data; name="uploadedfile"; filename="test.jpg"
  
  Content-Type: text/jpeg
  
  
  
  ÿØÿà
  
  -----------------------------7d82751e2bc0858--
  </code></pre>
  
  <p>Thanks</p>