Seite 1 von 1

ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 11:47
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?

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 11:51
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.

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 11:54
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.

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 12:02
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.

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 12:04
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

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 12:29
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.

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 17:42
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

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 17:53
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

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 18:03
von ProgOldie
Danke, Nic
das ist sehr informativ. Das mit der Prüfung von HTTPHeader() als Erstes check ich 'mal.

Re: ReceiveHTTPFile mit Verzeichnis

Verfasst: 30.07.2019 18:25
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