Seite 2 von 2

Verfasst: 01.10.2006 18:02
von Xaby
Nein! Tut mir leid.

Das Programm liefert nicht das gewünschte ergebnis.

Hier mein Beispielbild zum Downloaden: Falscher Name:

link enfernt (nicolaus)
von mir aus auch
link enfernt (nicolaus)

oder was weiß ich.

Die runtergeladene Datei ist immer 29KB groß. Ist wohl ne HTML-Datei.
Der Server sendet also falsche Daten, bei falscher Anfrage!

Und zur Überprüfung der Dateigröße müsste ich ja vorher schon wissen, wie groß eine Datei ist.

Und ganz ehrlich, ich möchte ja vorher wissen, ob es die Datei gibt auf dem Server. Denn was nützt es mir, wenn ich falsche Daten runterlade und Traffic erzeuge, und später noch schauen muss, ob es überhaupt die Daten sind, die ich wollte.

War ein netter Versuch. Aber vielleicht seht ihr ja an dem Beispiel, dass meine Frage im Forum nicht unberechtigt ist /:->

Vielleicht fällt euch ja noch was ein. Dank euch, nettes Programm.
Aber hilft in dem Falle nicht weiter :roll:

Gruß, Folker

Verfasst: 01.10.2006 18:06
von DarkDragon
Mach die Links bitte raus, danke.

Verfasst: 01.10.2006 18:17
von nicolaus
Also wenn es die Datei NICHT gibt und der server dir dennoch ne Datei gibt, noch dazu ne html obwohl du nen jpg willst, dann ist das ne interne einstellung des servers.

Normal ist es so, das du wenn die Datei auf dem server nicht unter der URL vorhanden ist, den fehler 404 bekommst (wie in meinem code zu sehen)
und so passt also auch mein code den der fängt ja den Fehler 404 ab.

Gruß,
Nico

Verfasst: 02.10.2006 00:20
von AND51
Du weißt ja, das der Server dir senden kann, was er will?

Z. B. bei freenet fällt mir grad ein. Gehst auf ne Seite, die es nicht gibt, schon kommst du auf eine andere HTML Seite die sagt, die Seite ward nicht gefunden. Somit gilt für deinen Code die Seite doch als existent, da dir ja Quellcode gesendet wird.

Verfasst: 02.10.2006 09:43
von nicolaus
AND51 hat geschrieben:Du weißt ja, das der Server dir senden kann, was er will?

Z. B. bei freenet fällt mir grad ein. Gehst auf ne Seite, die es nicht gibt, schon kommst du auf eine andere HTML Seite die sagt, die Seite ward nicht gefunden. Somit gilt für deinen Code die Seite doch als existent, da dir ja Quellcode gesendet wird.
Äh was willst du denn nun genau machen? willst du Dateien Downloaden die NICHT die Endung html, php oder ähnliche im web benuzte haben, oder willst du genau solche Dateien downloaden?

Normalerweisse ist es ja so das html Seiten nicht downloadbar sein sollen sondern angezeigt werden sollen.

Verfasst: 02.10.2006 18:02
von AND51
Der Client (bzw. dessen Browser) erkennt anhand der Dateiendung (php, htm, asp, cgi) nicht, ob es sich um Binärdaten (Bild, ZIP-Datei) oder schlcht um Textdaten (HTML-Websete, TXT-Datei) handelt.

Das bedeutet: Ich klicke z. B. auf www.freenet.de/Gibt_es_nicht.zip und ich erhalte HTML Code.

Der Server legt im Header, der vor der Datei gesendet wird, fest, um welchen Typ von Daten es sich handelt:

Webseite: 'Content-Type: text/html'
Binärdaten: 'Content-type: application/octet-stream'

Da der Server einem Senden kann was man will, ist es nicht eindeutig möglich, mit URLDownloadToFile_() zu prüfen, ob eine Datei im Internet existiert.

Das einzig wahre wäre die HEAD-Methode, die ich schon mal angespochen habe. Diese methode verlangt vom Server nur den Header der Datei, wenn die Datei nicht existiert, gibt's den Code 404. Wenn doch, dann 200. Ich würde aber nie auf <>404 sondern immer auf = 200 prüfen. Denn es gibt dutzende anderer Codes, die auf einen Error hiwneisen.

Verfasst: 04.10.2006 09:06
von Xaby
Hast vielleicht noch einen schnuckligen Beispiel-Code .... :?


Der erst mit der ,,Head-Methode,, wie du sie nennst, herausfindet, ob der Server nicht schwindelt. Und dann kann man sich ja überlegen, ob man die Datei runterladen will oder nicht mit URLDownloadToFile_().

Dann kann man theoretisch doch schon vor dem Download der gesamten Datei erfahren, ob es sich zum Beispiel um eine JPEG-Datei handelt und wie viele KBs sie hätte, wenn sie fertig wäre.

Würde mich freuen, wenn du noch was zu schreibst.

Gruß, Folker :allright:

Verfasst: 04.10.2006 11:51
von AND51
Hallo Folker!

Habe dir hier einen Code geschrieben:

Code: Alles auswählen

EnableExplicit

Define request.s, *response=AllocateMemory(4096), verbindung

request+"HEAD /index.html HTTP/1.0"+#CRLF$
request+"Connection: Close"+#CRLF$
request+#CRLF$

InitNetwork()

verbindung=OpenNetworkConnection("google.de", 80)

SendNetworkData(verbindung, @request, Len(request))

Repeat : Until ReceiveNetworkData(verbindung, *response, 1000) <> 1000

Debug PeekS(*response)
Unnötige If-Abfragen lasse ich bei solchen Präsentationen immer weg.

Also, sagen wir, du willst prüfen, ob http://www.google.de/index.html existiert. Dann musst du die Domain bei OpenNetworkConnection() eintragen (HTTP-Server sitzen standardmäßig an Port 80), den Rest des Pfades musst du in der ersten Zeile des Requests (Anfrage) zwischen der Request-Methode (hier HEAD) und der Angabe des HTTP-Protokolls notieren. Ich empfehle HTTP/1.0 statt 1.1 zu verwenden, weil die etwas einfacherer handzuhaben ist.

Content-Type: Bezeichnet den Datentyp, was da gleich ankommt. text/html steht für normnale Webseiten. image/jpeg wäre z. B. eine JPG-Datei.
Weitere Formate findest du hier: http://de.selfhtml.org/diverses/mimetypen.htm

Content-Length: bezeichnet die 'Länge' der Datei in Bytes(also die Dateigröße)

Server: bezeichnung des Servers, nur zu Informationszwecken.

Das wichtigtste:
Die erste Zeile: Google sandte mir 302 als Statuscode. die beschreeibung dahinter, "Found", geht auch. ich hatte allerdings Code "200 OK" erwartet, aber egal. Auf welche Codes du, Folker, reagierst, bleibt dir überlassen: http://www.html-world.de/program/http_8.php Im Wesentlichen auf grundlage der zuletzt genannten Seite programmiere ich momentan meinen eigenen HTTP-Webserver 8)
Ich freue mich, Folker, wenn du eines Tages mal auf einem Server mit meiner Software eine solche HEAD-Abfrage machen musst, wenn ich ganz groß damit rauskomme :lol: :allright:

Auf der zuletzt genannten URL kannst du noch ein bisschen schökern, um zu erfahren, was für Informationen noch in deinem request oder des Server's Response (Antwort) vorkommen können.

Zuletzt noch: Sendest du am Anfang GET statt HEAD, bekommst du zwar auch einen Header, aber gleich die eigentliche Datei mitgeliefert, sofern existent; somit kannst du die Datei direkt runterladen und kannst auf URLDownloadToFile_() verzichten, dnen der Befehl geht bei mir sowieso nicht immer /:->

Hinweis: Wenn du das machst: nach der letzten zeile des Response und deines requests, die i. d. R. mit "Connection: Close/Keep-Alive" aufhört, folgt immer #CRLF$+#CRLF$ !!
Wichtig! Wenn u also eine Datei runterlädst (der Buffer in meinen beispil sollte vorsichtshalber größer als nur 4 KB sein), trennst du die Daten in 2 Hälften: Einmal den Request, der bis #CRLF$+#CRLF$ geht, der rest nach den Zwei Zeilenumbrüchen sind alles die Dateien, die du mit WriteData() in eine Datei schreiben musst!
Keine Angst, bei "Content-Length" steht ja immer in Bytes, wie viele Zeichen einzulesen sind!

Tipp: Schau mal auf den zuletzt genannten Link und such mal nach "Ranges". Antwortet der Server im response mit "Accept-Ranges: Bytes", dann ist es möglich, eine Datei teilweise runterzuladen, weil der Server das unterstützt. Klingelts? Richtig, somit kannst du abgebrochene Dateien wieder aufnehmen. Steht alles auf dem zuletzt genannten Link, welches übrigens eine Art Tuitorial zum Thema "HTTP-protokoll" ist.






So. Viel Spaß mit dem Code und den Informationen. :allright:

Verfasst: 04.10.2006 21:15
von Xaby
Schade, dass ich deinen Beitrag nicht bewerten kann.

Sonst hättest du jetzt 9.8 von 10.0 möglichen Punkten bekommen.

Ein herzliches Dankeschön, es sollten sich andere User hier im Forum ein Beispiel an dir nehmen.

Die anderen 0.2 Punkte bekommste nicht, weil du kein Mädchen bist und du mir den Code nicht persönlich in Unterwäsche gebracht hast. :mrgreen:

Noch mal vielen Dank. Gruß, Folker :allright:

Verfasst: 05.10.2006 13:11
von AND51
> Die anderen 0.2 Punkte bekommste nicht, weil du kein Mädchen bist...

Also ganz im Vertrauen... Ich bin eigentlich froh darüber! :lol: :D