ReceiveHTTPFile mit Verzeichnis

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

ReceiveHTTPFile mit Verzeichnis

Beitrag von ProgOldie »

Ich habe in der Cloud im Verzeichnis URL_Quelle mehrere Dateien unterschiedlichen Typs.
Nun möchte ich den gesamten Inhalt des Verzeichnisses bzw. Dateien mit bestimmtem Muster herunterladen, ohne die Dateinamen zu benutzen.
Letztlich brauche ich so etwas wie receiveHTTPDir(URL_Quelle, FileMuster , ZielDir)

Im Prinzip wäre das nicht schwierig, wenn ich wüsste, wie man - entsprechend ExaminDirectory() - ein solches Verzeichnis im Netz durchläuft.
Wer gibt mir einen Einstiegstip?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von RSBasic »

Du kannst mit ReceiveHTTPFile() nur einzelne Dateien herunterladen, nicht ganze Verzeichnisse.
Du kannst aber eine php-Datei schreiben, die für dich das gewünschte Verzeichnis zippt. Danach kannst du diese Datei mit ReceiveHTTPFile() herunterladen und entpacken.
Oder du schreibst eine php-Datei, die dir eine Dateiliste dieses Verzeichnisses bereitstellt, damit du jede Datei automatisiert herunterladen kannst.
Falls bereits eine Seite zum Auflisten aller Dateien existiert, dann schreibst du einen kleinen Parser und lädst die Dateien einzeln herunter.
Oder eine andere Möglichkeit wäre, wenn du das Verzeichnis per FTP herunterlädst.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von NicTheQuick »

Ist das ein WebDAV-Zugang mit Nutzername und Passwort oder ein öffentlicher Link auf ein Verzeichnis in einer Cloud, der als HTML ausgeliefert wird?
WebDAV wäre standardisiert, alles andere ist implementierungsabhängig vom Cloudanbieter und da bräuchten wir dann Beispiele.

Allerdings kann Purebasic meines Wissen nativ auch kein WebDAV, du wärst also auf Drittanbieterbibliotheken angewiesen oder müsstest das selbst implementieren, was aber vermutlich mit den nativen Mitteln auch nicht möglich wäre.
RSBasic hat geschrieben:Oder eine andere Möglichkeit wäre, wenn du das Verzeichnis per FTP herunterlädst.
Bitte nicht! Unverschlüsselte veraltete Protokolle sollten bitte weiterhin ausgerottet werden.
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von ProgOldie »

Danke erstmal,
die Idee mit PHP und Zip ist machbar, obwohl ich gern alles von PB aus machen würde.

Hintergrund: Ich will für Datenbankanwendungen in der Cloud ein update-Verzeichnis zur Verfügung stellen, das Module, Formulare, Reports u.ä. bereithält. (kurz: nahezu alles, was nichts mit den Daten selbst zu tun hat). Aus dem aktuellen DB-System lässt sich so etwas leicht exportieren, zur Not muss ich es eben nachträglich zippen. Der Benutzer kann dann das Zip herunterladen, es selbst entpacken und dann die entsprechenden Dateien auf seinem Rechner überschreiben.
@Nic: Es ist ein ausgelieferter Link auf das Verzeichnis.
Zuletzt geändert von ProgOldie am 30.07.2019 12:05, insgesamt 1-mal geändert.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von RSBasic »

NicTheQuick hat geschrieben:
RSBasic hat geschrieben:Oder eine andere Möglichkeit wäre, wenn du das Verzeichnis per FTP herunterlädst.
Bitte nicht! Unverschlüsselte veraltete Protokolle sollten bitte weiterhin ausgerottet werden.
Das stimmt. Wenn man über FTP herunterladen möchte, dann unbedingt über eine gesicherte SFTP-Verbindung: viewtopic.php?f=11&t=30712
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von NicTheQuick »

ProgOldie hat geschrieben:@Nic: Es ist ein ausgelieferter Link auf das Verzeichnis.
Und was sendet der Server zurück, wenn man den Link öffnet? Was ist das für eine Cloud? Dropbox, Owncloud, Nextcloud, was ganz anderes, was selbst gebasteltes?

Es kann jedenfalls nur in zwei Schritten gehen: Zuerst die Dateiliste herunterladen, dann jede Datei einzeln herunterladen.
Und du hast uns bisher noch nicht gesagt wie die Dateiliste aussieht. Da du von Cloud sprichst, gehe ich von einer bekannten Cloud-Software aus, die vermutlich eine schick formatierte HTML-Ansicht des Verzeichnisinhaltes zurück gibt. Aber andererseits kann man diese Clouds meist auch mittels WebDAV ansprechen, sodass man sich als Nutzer sein Cloudverzeichnis sogar als Netzlaufwerk unter Windows einbinden könnte.
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von ProgOldie »

Ich habe das mit dem Zip-File 'mal probiert und bin beim Herunterladen schon auf ein merkwürdiges Verhalten von ReceiveHTTPFile() gestoßen.

Code: Alles auswählen

InitNetwork()
source="https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip" 
updateDir=GetCurrentDirectory()+"URL_Files\"
new_File="Test_Zip_2MB.zip"

If ReceiveHTTPFile(source,updateDir+"\"+new_File)
  Debug "URL gefunden"
Else
  Debug "URL nicht gefunden"
EndIf
Das File 'source' gibt es, ich kann es mit dem Programmabschnitt problemlos herunterladen. Es wird an der gewünschten Stelle im vorhandenen Verzeichnis 'updateDir' unterdem gewünschten Namen gespeichert. Entpacken zeigt, dass es auch richtig heruntergeladen wurde.

Ändere ich nun irgendetwas an 'source' (z.B. Anhängen eines X .../zip_2MBX.zip) wird trotzdem "URL gefunden ausgegeben" und eine winzige ca. 9kB große leere Zip-Datei heruntergeladen.

Wie kommt das und wie erreiche ich eine korrekte Fehlermeldung, falls 'source' nicht (wie mit dem X) definiert ist?

Edit: Vergessen: PB 5.70
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von NicTheQuick »

Das ist normal. Solange der Webserver irgendeine Antwort gibt, wird auch etwas heruntergeladen. Leider ist der Fehlercode von ReceiveHTTPFile nicht besonders aussagekräftig, sonst könnte man feststellen, wenn der Server die einen 404-Fehler zurückgibt.
Versuch mal mit GetHTTPHeader() den Header des Links herunterzuladen. Wenn im Ergebnis dann sowas wie "HTTP/1.1 200 OK" steht, dann sollte die Datei existieren und kann heruntergeladen werden. Ist es aber ein "404" oder ähnliches, dann existiert sie nicht und ReceiveHTTPFile wird dir die Fehlerseite herunterladen. Ich kann mir auch nicht vorstellen, dass du mit dem falschen Link eine valide ZIP-Datei erhalten hast. Vermutlich ist es eher eine HTML-Datei mit der Dateiendung ".zip". Und solange du unter Windows arbeitest, sieht das dann nur wie eine ZIP-Datei aus, ist aber keine.

Du nutzt scheinbar Wordpress als Quelle und keine richtige Cloud, sondern führst lediglich HTTP-Downloads aus.

Moment, mir ist gerade erst aufgefallen, dass du einen echten Link gepostet hast. Dann kann ich dir das Beispiel ja gleich liefern:

Code: Alles auswählen

InitNetwork()
Debug GetHTTPHeader("https://file-examples.com/wp-content/uploads/2017/02/zip_2MBX.zip")
ergibt
HTTP/1.1 404 Not Found
Date: Tue, 30 Jul 2019 15:51:49 GMT
Server: Apache/2.4.10
Content-Type: text/html; charset=iso-8859-1
Und deine 9kB ZIP-Datei ist in Wirklichkeit auch keine, sondern nur die Fehlermeldung als HTML-Datei.

Edit:
Du kannst also zuerst GetHTTPGHeader() auf den Link loslassen und wenn es ein "200 OK" gibt, dann kannst du den Link auch herunterladen. Praktischerweise liefert dir der Header auch gleich die zu erwartende Dateigröße:

Code: Alles auswählen

InitNetwork()
Debug GetHTTPHeader("https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip")
ergibt
HTTP/1.1 200 OK
Date: Tue, 30 Jul 2019 15:56:06 GMT
Server: Apache/2.4.10
Last-Modified: Mon, 13 Nov 2017 10:19:05 GMT
ETag: "1f147d-55dda99a12fb6"
Accept-Ranges: bytes
Content-Length: 2036861
Cache-Control: max-age=0
Expires: Tue, 30 Jul 2019 15:56:06 GMT
Content-Type: application/zip
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von ProgOldie »

Danke, Nic
das ist sehr informativ. Das mit der Prüfung von HTTPHeader() als Erstes check ich 'mal.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: ReceiveHTTPFile mit Verzeichnis

Beitrag von ProgOldie »

Für Interessenten: Es funktioniert wie folgt:

Code: Alles auswählen


EnableExplicit
Define.s source,updateDir,new_File

ProcedureDLL.i existsURL(URL.s)
  Define.s Line
  ;der Headeraufbau ist serverabhängig !!
  Line=StringField(GetHTTPHeader(URL),1,#LF$)
  If FindString(Line,"200 OK")
    ProcedureReturn 1
  Else
    ProcedureReturn 0  
  EndIf
EndProcedure


InitNetwork()
source="https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip" 
updateDir=GetCurrentDirectory()+"URL_Files\"
new_File="Test_Zip_2MB.zip"

If existsURL(source)
  Debug "gefunden"  
  If ReceiveHTTPFile(source,updateDir+"\"+new_File)
    Debug "Kopiert"
  Else
    Debug "Fehler beim Herunterladen"
  EndIf
Else
  Debug "URL existiert nicht"
EndIf
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten