Upload przez HTTP

0

Witam, przedstawiam poniżej kod, wysyłający plik na serwer przez http:

BOOL UseHttpSendReqEx(HINTERNET hConnect, TCHAR *upFile)
   {
     static Wininet::INTERNET_BUFFERS BufferIn = {0};
     DWORD dwBytesRead;
     DWORD dwBytesWritten;
     BYTE pBuffer[1024];
     BOOL bRead, bRet;

     BufferIn.dwStructSize = sizeof( Wininet::INTERNET_BUFFERS );

     BufferIn.lpcszHeader   =   _T(" -----------------------------7d23542a1a12c2 Content-Disposition: form-data; name=\"filename\"; filename=\"C:\\155.fet\" Content-Type: multipart/form-data -----------------------------7d21fa22012ca--");   

     BufferIn.dwHeadersLength = strlen(BufferIn.lpcszHeader);
     BufferIn.Next=NULL;

     HINTERNET hRequest = HttpOpenRequest (hConnect, "PUT",
         "/syst.php", NULL, NULL, NULL,  0, 0);
     if (!hRequest)
     {
     ShowMessage("\nFailed to open reqeust.");
       return false;
     }

     HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
     {
       ShowMessage("\nFailed to open local file %s.");
       return false;
     }

     FILE * f = fopen( upFile, "r" );
     fseek( f,0, SEEK_END );
     long size = ftell( f );
     fclose( f );

     BufferIn.dwBufferTotal = size;

     if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
     {
       ShowMessage(GetLastError());
       return false;
     }
     DWORD sum = 0;
     do
     {
       if  (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),
           &dwBytesRead, NULL)))
       {
         ShowMessage("\nReadFile failed on buffer %lu.");
         break;
       }
       if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,
           &dwBytesWritten)))
       {
         ShowMessage("\nInternetWriteFile failed %lu");
         break;
       }
       sum += dwBytesWritten;
     }
     while (dwBytesRead == sizeof(pBuffer)) ;

     CloseHandle (hFile);
     ShowMessage("Actual written bytes: %d\n"+IntToStr(sum));

     if(!HttpEndRequest(hRequest, NULL, 0, 0))
     {
       printf( "Error on HttpEndRequest %lu \n");
       return false;
     }
     return true;
   }

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  HINTERNET   pServer,pSession;
  pSession=InternetOpen("seantest",INTERNET_OPEN_TYPE_PRECONFIG   ,"","",INTERNET_FLAG_ASYNC);
  pServer   = InternetConnect(pSession, "www.afkota.pl", 80, NULL, NULL, INTERNET_SERVICE_HTTP,   INTERNET_FLAG_NO_CACHE_WRITE, 0);
  bool co=UseHttpSendReqEx(pServer,"C:\\155.fet");
}

Wyskakuje mi błąd (Error 997 czyli ERROR_IO_PENDING) przy HttpSendRequestEx, na internecie nic zabardzo nie znalazłem jak zaradzić temu problemowi, dlatego zwracam się do was z wielką prośbą o pomoc. Troche mieszałem, więc ten kod może być troche absurdlany. Z góry wielkie dzięki za pomoc.

0

nie mam niestety czasu sie zbytnio zaglebiac..

static Wininet::INTERNET_BUFFERS BufferIn = {0};

...static?

     BufferIn.lpcszHeader   =   _T(" -----------------------------7d23542a1a12c2 Content-Disposition: form-data; name=\"filename\"; filename=\"C:\\155.fet\" Content-Type: multipart/form-data -----------------------------7d21fa22012ca--");

z tego co pamietam, KAZDY JEDEN header (czyli para nazwa-wartosc) musi byc umieszczony w oddzielnej linii zakonczonej CRLFem. przyznam, nie pamietam HTTP-PUT, ale te ciagi minusow zakonczone jakims hashem oraz headery podane w jednej linii mi śmierdzą

     HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
     {
       ShowMessage("\nFailed to open local file %s.");
       return false;
     }

     FILE * f = fopen( upFile, "r" );
     fseek( f,0, SEEK_END );
     long size = ftell( f );
     fclose( f );

moglbys sie zdecydowac czy uzywasz winapiowego CreateFile czy ANSI-C'owego fopen. poza tym otwierasz dwa uchwyty do tego samego pliku. czysty fart ze dwa razy read-only i akurat sie udaje

     BufferIn.dwBufferTotal = size;
     if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
...
     do {
...       ReadFile (hFile, pBuffer, sizeof(pBuffer),
...
          InternetWriteFile( hRequest, pBuffer, dwBytesRead,
     }
     while (dwBytesRead == sizeof(pBuffer)) ;

powtorze sie, nie uzywam win-inet-api ale kolejnosc operacji (wysylam request, potem plik) wyglada mi conajmniej dziwnie

Wyskakuje mi błąd (Error 997 czyli ERROR_IO_PENDING) przy HttpSendRequestEx

blad sugeruje ze jakas wczesniejsza operacja sie jeszcze nie zakonczyla - moze open? moze connect? moze by tak warto sprawdzic czy sie powiodly i nie zwrocily bledu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1