mst Geschrieben 28. November 2001 Teilen Geschrieben 28. November 2001 Hallo ich habe ein Problem, an dem ich schon ein paar Tage sitze: Ich muß einige Dateien aus dem Internet downloaden per http. Mit Textdateien scheint das auch zu funktionieren, aber mit den Grafikdateien habe ich große Probleme: Es wird kein Fehler ausgegeben oder so. Es wird aber nur ein Teil der Grafikdatei heruntergeladen z.B. 5.088 Bytes anstatt 6.449 Bytes. Bitte helft mir, wo ist der Fehler? Dazu benutze ich folgenden Code: #define HTTPBUFLEN 512 // Size of HTTP Buffer... BOOL bStripMode = FALSE; BOOL bProgressMode = FALSE; DWORD dwHttpRequestFlags = INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT; const TCHAR szHeaders[] = _T("Accept: text/plain, text/html, image/png\r\nUser-Agent: -unbekannt-\r\n"); try { CHttpFile* pFile = NULL; CHttpConnection* pServer = NULL; CString strServerName; INTERNET_PORT nPort; DWORD dwServiceType; CString strObject; if(!AfxParseURL(strFile,dwServiceType,strServerName,strObject,nPort) || dwServiceType != INTERNET_SERVICE_HTTP) { AddToLoglist("ERROR: Fehler beim Ermitteln der Remote-Datei"); return FALSE; } pServer = m_pSession->GetHttpConnection(strServerName,nPort); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags); pFile->AddRequestHeaders(szHeaders); pFile->SendRequest(); DWORD dwRet; pFile->QueryInfoStatusCode(dwRet); if(dwRet==HTTP_STATUS_OK) { pFile->SetReadBufferSize(4096); CString strText; char httpbuff[HTTPBUFLEN]; int numbytes; while (numbytes = pFile->Read(httpbuff, HTTPBUFLEN)) pLocalFile->Write(httpbuff, numbytes); if(pFile !=NULL) { pFile->Close(); delete pFile; pFile = NULL; } if(pServer != NULL) { pServer->Close(); delete pServer; pServer = NULL; } return TRUE; } else { if(pFile !=NULL) { pFile->Close(); delete pFile; pFile = NULL; } if(pServer != NULL) { pServer->Close(); delete pServer; pServer = NULL; } CString strTemp; strTemp.Format(_T("ERROR: bei Anfrage auf %s: Rückgabe: %d."),strFile,dwRet); AddToLoglist(strTemp); return FALSE; } } catch(CInternetException *E) { TCHAR szError[MAX_PATH]; E->GetErrorMessage(szError,MAX_PATH); CString strTemp; strTemp = (CString)"ERROR: " + (LPCTSTR)szError; AddToLoglist(strTemp); E->Delete(); return FALSE; } catch(CFileException *E) { TCHAR szError[MAX_PATH]; E->GetErrorMessage(szError,MAX_PATH); CString strTemp; strTemp = (CString)"ERROR: " + (LPCTSTR)szError; AddToLoglist(strTemp); E->Delete(); return FALSE; } <FONT COLOR="#a62a2a" SIZE="1">[ 28. November 2001 10:04: Beitrag 1 mal editiert, zuletzt von mst ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 28. November 2001 Teilen Geschrieben 28. November 2001 Ich würde die Dateinamen abchecken. Stimmt irgendein Filetyp nicht mit html überein (Kein Tag am Start), dann würde ich lieber versuchen über CInternetFile einzulesen - oder gleich alle Files. Vielleicht werden irgendwelche Bytes über HTTP als Steuerzeichen interpretiert und es wird halt einfach abgebrochen. CInternetFile sollte da keine Rücksicht drauf nehmen. <FONT COLOR="#a62a2a" SIZE="1">[ 28. November 2001 10:25: Beitrag 3 mal editiert, zuletzt von Crush ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mst Geschrieben 28. November 2001 Autor Teilen Geschrieben 28. November 2001 Die Dateinamen passen nicht mit html überein, aber das sollte eigentlich wegen der Zeile const TCHAR szHeaders[] = _T("Accept: text/plain, text/html, image/png\r\nUser-Agent: -unbekannt-\r\n"); trotzdem funktionieren. Die Idee mit CInternetFile probiere ich gerade aus. Ich hoffe nur, das man damit auch in passwortgeschütze Bereiche kommt. Andere Idee: An welchen Stellen im http-Protokoll wird zwischen ASCII- und Binären- Dateien unterschieden? Mit text/plain und text/html funktioniert das alles. Danke für die Hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 28. November 2001 Teilen Geschrieben 28. November 2001 Kopier Dir doch einfach mal eins von den abgebrochenen Gifs runter und schau am entsprechenden Offset an dem Dein Programm abgebrochen hat nach was da steht. Es gibt ja für Binärdaten ein spezielles Tag: Formatierte Texteingabe (preformatted) <PRE> Eine Eingabe von: <PRE> 11111000000 binär 3700 oktal 7C0 hexadezimal 1984 dezimal </PRE> Bewirkt eine Darstellung wie: 11111000000 binär 3700 oktal 7C0 hexadezimal 1984 dezimal Das wird schon seinen Sinn haben. Weil nämlich bestimmte Binärkombinationen in roher Form den Browser abschießen werden - er weiß ja nicht mehr, ab wann die Binärdaten aufhören sollten ohne Tags. <FONT COLOR="#a62a2a" SIZE="1">[ 28. November 2001 10:45: Beitrag 2 mal editiert, zuletzt von Crush ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mst Geschrieben 28. November 2001 Autor Teilen Geschrieben 28. November 2001 Die Variante mit dem CInternetFile hat funktioniert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 28. November 2001 Teilen Geschrieben 28. November 2001 Nicht verzagen ... Crush fragen =8-D Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.