Seite 1 von 1

Datei im www vorhanden?

Verfasst: 24.04.2005 23:50
von Jet1199
Hallo,

mit
If FileSize("http://www.mydomain.de/bild.jpg")=-1

möchte ich die Existenz einer Datei im Internet abfragen. Entsprechend möchte ich auswerten, ob meine zu einer Datenbank gehörigen Fotos bereits hochgeladen sind oder noch besorgt werden müssen.

Gebe ich zwischen den Gänsefüßchen einen Dateinamen auf der lokalen Festplatte ein, klappt es bestens.

Ich bin gespannt auf eine Lösung und bedanke mich im Voraus!

Verfasst: 24.04.2005 23:56
von Icke
Mit Filesize wird das nicht gehen. Ich denke das es generell schwierig sein wird über HTTP, kenne mich da nicht 100%ig aus aber hab nie was drüber gehört das solche Info´s abgerufen werden können ohne die Daten vom Inet runterzuladen. Bei FTP geht sowas mit "FtpGetFileSize"

staun!

Verfasst: 25.04.2005 00:10
von Jet1199
Es ist doch immer wieder unklar, wie schnell man hier eine Antwort bekommen kann. Danke, Icke!

Gegen FTP spricht nichts, sind ja die eigenen Seiten. Werd mich - nachdem ich mich in die Waagerechte begeben habe - mal mit den Parametern beschäftigen, da sind ja bestimmt Paßwort un so nötig.

Ist aber ein Schritt in die richtige Richtung ... Danke :allright: !

Re: staun!

Verfasst: 25.04.2005 09:15
von traumatic
Jet1199 hat geschrieben:Ist aber ein Schritt in die richtige Richtung ... Danke
:allright: !
Ich würde sagen: "Nein, ist es nicht".

Warum sollte man per FTP schauen wollen, ob eine Datei per Browser
erreichbar ist? Und was, wenn auf dem Server überhaupt kein FTP
läuft?

Ich würde einen HTTP (GET) request auf das entsprechende File
schicken. Kommt ein 404 zurück, existiert die Datei nicht.
Bei vielen Servern kann auch direkt die Dateigröße ermittelt
werden.

Ich weiß, "Anfänger-Forum", aber es gab bereits soviele Beispiele
zum Thema HTTP-Requests, dass ich an dieser Stelle einfach mal
auf die Suche hinweisen möchte, Du wirst sicher fündig werden
und das passende finden. :)

FTP oder HTTP-Request?

Verfasst: 25.04.2005 09:44
von Jet1199
Danke auch für die "zweite" Meinung. Kann ich hier auf Arbeit nicht ausprobieren ... erst heut abend.

Es geht prinzipiell darum, daß ich natürlich eine Auskunft haben möchte, ob ich alle Fotos einer Internetpräsentation habe oder ob Zuarbeiten fehlen. Aber wie weiss das der Zuarbeiter? Bisher schickte ich ihm meine Auswertung (von den Festplattendaten) als PDF, aber wenn er selbst "sofort" schauen könnte wärs natürlich besser.

FTP kann ich problemlos einrichten, diese Lösung klingt gut. Die 404er mit HTTP sehe ich mir aber auf jeden Fall auch an. Nach "HTTP" und "Request" hab ich leider noch nicht gesucht, recherchiert im Forum aber schon.

CU - Jet1199 :D

Verfasst: 25.04.2005 14:06
von MLK
Dafür reicht ein HEAD Request.

Code: Alles auswählen

Procedure WebFileExists(Server$, File$)
  If InitNetwork() = #False : Debug "can't init network!" : Else
    ServerID = OpenNetworkConnection(Server$, 80)
    If ServerID = #False : Debug "can't connect to " + Server$ + " !" : Else
      Request$ = "HEAD " + File$ + " HTTP/1.1" + #CRLF$
      Request$ + "Host: " + Server$ + #CRLF$
      Request$ + "Accepted: */*" + #CRLF$
      Request$ + #CRLF$
      
      SendNetworkString(ServerID, Request$)
      
      Buffer$ = Space($FF)
      Repeat
        inLen = ReceiveNetworkData(ServerID, @Buffer$, Len(Buffer$))
        Reply$ + Left(Buffer$, inLen)
      Until inLen = #False
      
      If Val(StringField(Reply$, 2, " ")) = 200
        ;MessageRequester("Datei existiert! (Code '200 OK')", Reply$)
        ProcedureReturn #True
      EndIf
    EndIf
  EndIf
EndProcedure

;#############

Server$ = "www.robsite.de"
File$ = "/bilder/banner/getfirefox.gif"

If WebFileExists(Server$, File$)
  MessageRequester("", "Datei existiert!")
Else
  MessageRequester("", "Datei existiert nicht!")
EndIf

Zeitkritisch, aber korrektes Ergebnis

Verfasst: 25.04.2005 23:05
von Jet1199
Danke @MLK,

hab Deinen Vorschlag realisiert, der FTP-Hinweis sah natürlich einfacher aus, aber es war wohl eben kein pb-Befehl ...

Das Problem: Die Laufzeit. Das Programm hängt fast ständig in der Zeile
inLen = ReceiveNetworkData(ServerID, @Buffer$, Len(Buffer$))
fest. Erst nach zahlreichen Einzelschritten komme ich von der Zeile los, in der ich in der nächsten Runde wieder hängen bleibe.

Ca. 15s je Datensatz, zusätzlich hab ich den Effekt, daß mein Programmfenster weiss und inhaltslos wird. Eine PB-Macke, die ich auch noch nicht im Griff habe, die aber hier ernsthaft stört, da ja ein Fortschrittsbalken so keinen Sinn machen würde ...

Re: Zeitkritisch, aber korrektes Ergebnis

Verfasst: 26.04.2005 07:20
von Kiffi
Jet1199 hat geschrieben: Ca. 15s je Datensatz, zusätzlich hab ich den Effekt, daß
mein Programmfenster weiss und inhaltslos wird.
hier würde sich dann die Verwendung von Threads lohnen.

Grüße ... Kiffi

Verfasst: 26.04.2005 08:16
von NicTheQuick
Es müssen keine Threads sein. Ein WindowCallback wirkt Wunder.

Verfasst: 26.04.2005 12:25
von MLK
Wenn bei einem HEAD Request auszuschließen ist, dass der Server weniger bytes auf einmal schickt als angefordert, also viel kleinere pakete als in Len(Buffer) festgelegt - DANN könnte man einen kleinen Geschwindigkeitsvorteil durch den austausch von:

Code: Alles auswählen

Until inLen = #False
mit:

Code: Alles auswählen

Until inLen < Len(Buffer$)
erwirken.

bzw könnte man auch nur die erste zeile mit dem evtl. 200er code abfangen indem man nur die ersten 12 - zur sicherheit 13 - bytes anfordert bzw empfängt:

Code: Alles auswählen

Procedure WebFileExists(Server$, File$)
  If InitNetwork() = #False : Debug "can't init network!" : Else
    ServerID = OpenNetworkConnection(Server$, 80)
    If ServerID = #False : Debug "can't connect to " + Server$ + " !" : Else
      Request$ = "HEAD " + File$ + " HTTP/1.1" + #CRLF$
      Request$ + "Host: " + Server$ + #CRLF$
      Request$ + "Accepted: */*" + #CRLF$
      Request$ + #CRLF$
      
      SendNetworkString(ServerID, Request$)
      
      Reply$ = Space(13)
      ReceiveNetworkData(ServerID, @Reply$, Len(Reply$))

      CloseNetworkConnection(ServerID)
      
      If Val(StringField(Reply$, 2, " ")) = 200
        ;MessageRequester("Datei existiert! (Code 200 OK)", Reply$)
        ProcedureReturn #True
      EndIf
    EndIf
  EndIf
EndProcedure

;#############

Server$ = "www.robsite.de"
File$ = "/bilder/banner/getfirefox.gif"

If WebFileExists(Server$, File$)
  MessageRequester("", "Datei existiert!")
Else
  MessageRequester("", "Datei existiert nicht!")
EndIf
und schon läufts zig mal schneller :-)