Datei im www vorhanden?

Anfängerfragen zum Programmieren mit PureBasic.
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Datei im www vorhanden?

Beitrag 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!
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag 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"
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

staun!

Beitrag 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: !
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Re: staun!

Beitrag 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. :)
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

FTP oder HTTP-Request?

Beitrag 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
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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
Constant not found: #vk_shit
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Zeitkritisch, aber korrektes Ergebnis

Beitrag 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 ...
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Zeitkritisch, aber korrektes Ergebnis

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Es müssen keine Threads sein. Ein WindowCallback wirkt Wunder.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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 :-)
Constant not found: #vk_shit
Antworten