HTTP Uplaod und Download
-
Hallo,
ich möchte Daten auf einen Server hochladen und von woanders wieder runterladen.
Die Internetverbindung habe ich erfolgreich hergestellt. Jetzt lade ich meine Daten hoch:SendString=Encrypt(SendString); TRY { REQUEST_CONTEXT rc; rc.pEx=this; m_dwContext=0; const char* strType[2]={"text/*",0}; HINTERNET hRequest; hRequest=HttpOpenRequest(m_hSession,"POST","EkkiCW.html",NULL,NULL,strType, INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD,(unsigned long)&rc); INTERNET_BUFFERS BUF; BUF.lpcszHeader=0; BUF.dwHeadersLength=0; BUF.dwHeadersTotal=0; BUF.lpvBuffer=0; BUF.dwBufferLength=0; BUF.dwBufferTotal=0; BUF.Next=0; BUF.dwStructSize=sizeof(BUF); DWORD OptionLength=0; if(HttpSendRequestEx(hRequest,&BUF,0,0,(unsigned long)&rc)) { DWORD error,length; char buffer[666]; buffer[0]=0; DWORD nWritten=0; m_dwContext=0; if(true/*InternetQueryDataAvailable(hRequest,&nWritten,0,(unsigned long)&rc)*/) { DWORD p=nWritten; if(InternetWriteFile(hRequest,SendString.GetBuffer(SendString.GetLength()),SendString.GetLength(),&nWritten)) { InternetGetLastResponseInfo(&error,buffer,&length); short z=0; } else { int f=nWritten; int d=GetLastError(); DWORD error,length; char buffer[333]; InternetGetLastResponseInfo(&error,buffer,&length); MessageBox(NULL,buffer,"",MB_OK); } } HttpEndRequest(hRequest,0,0,(unsigned long)&rc); InternetCloseHandle(hRequest); } else int d=GetLastError(); MSG msg; while(!m_dwContext) while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE)) { AfxGetThread()->PumpMessage(); } m_dwContext=0; } CATCH(CException, Ex) { int d=GetLastError(); RestartConnection(); goto start; } END_CATCH
Das klappt auch ganz gut. nWritten hat nach InternetWriteFile im Debugger den Wert, der die Länge des SendString darstellt. Soweit so gut.
Jetzt wieder herunterladen:start: bool bResult=false; while(!bResult) { TRY {//TRY REQUEST_CONTEXT rc; rc.pEx=this; m_dwContext=0; m_dwContext=0; char* buffer; const char* strType[2]={"*/*",0}; HINTERNET hRequest; hRequest=HttpOpenRequest(m_hSession,"GET","EkkiCW.html",NULL,NULL,strType, INTERNET_FLAG_KEEP_CONNECTION| INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS| INTERNET_FLAG_RELOAD|INTERNET_FLAG_SECURE| INTERNET_FLAG_NO_CACHE_WRITE| INTERNET_FLAG_KEEP_CONNECTION, (unsigned long)&rc); if(HttpSendRequest(hRequest,NULL,0,0,0)) { DWORD nToRead=0,nRead=0; BOOL bRes=InternetQueryDataAvailable(hRequest,&nToRead,0,(unsigned long)&rc); if(nToRead==0) short v=0; if(!bRes) short z=0; if(nToRead<=0) { int d=GetLastError(); goto stepMsg; } buffer= (char*) malloc(nToRead); if(!InternetReadFile(hRequest,buffer,nToRead,&nRead)) int h=GetLastError(); HttpEndRequest(hRequest,0,0,0); InternetCloseHandle(hRequest); MessageBox(NULL,buffer,"",MB_OK); } MSG msg; while(!m_dwContext) while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE)) { AfxGetThread()->PumpMessage(); } m_dwContext=0; *strResult=buffer; bResult=true; stepMsg: HttpEndRequest(hRequest,0,0,0); InternetCloseHandle(hRequest); } CATCH(CException, Ex) { int d=GetLastError(); RestartConnection(); goto start; }
Das Programm lädt etwas herunter, aber nur die Fehlermeldung 400: Url not found in Form einer html-Datei.
Hat jemand einen Rat?
Danke im Voraus
Jens
-
Öh.
Ich glaub nicht dass das senden so richtig ist.
Ich denke du musst wohl die Daten in der INTERNET_BUFFERS Struktur mitgeben ODER HttpSendRequestEx verwenden.Also: entweder alles (inklusive Daten) mit einem HttpSendRequest Call schicken & empfangen, ODER HttpSendRequestEx + InternetWriteFile + HttpEndRequest.
BTW: Doku lesen hilft oft.