Zum Inhalt springen

http-Download mit MFC


mst

Empfohlene Beiträge

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...