Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#22

AW: Delphi 10.4 - Indy und SFTP

  Alt 22. Jan 2023, 01:20
Die Allzweckwaffe ist Curl. Das Programm curl.exe ist Bestandteil aktueller Windows Versionen. Links: GitHub, Download, Manual, libcurl C API und libcurl C Beispiele. Zum schnellen Einstieg schreibst du mit Hilfe der Beispiele aus dem Manual einfache Batch-Dateien zum Testen deiner Fälle. Wenn alles wie gewünscht funktioniert, lade das benötigte Package aus dem Download und lege die libcurl.dll in dein Programmverzeichnis. Eine Kapselung für diese DLL findest du in der mORMot Unit mormot.lib.curl. Die mORMot Bibliothek muss nicht installiert werden. Den aktuellen Commit und die static binaries aus dem letzten Tag herunterladen. In Delphi die entsprechenden Bibliotheks- und Suchpfade setzen. Beim Erstellen hilft dieses Muster:
Code:
// Die Doppelpunkte einfach durch den Speicherpfad ersetzten
..\src;..\src\app;..\src\core;..\src\crypt;..\src\db;..\src\lib;..\src\misc;..\src\net;..\src\orm;..\src\rest;..\src\script;..\src\soa;..\src\tools\ecc;..\src\ui;
Für viele Anwendungsfälle findest du eine Vorlage in den libcurl C Beispielen. Das folgende Delphi Beispiel zeigt die Umsetzung für einen FTP/SFTP Download:
Delphi-Quellcode:
uses
  mormot.core.base,
  mormot.core.text,
  mormot.core.os,
  mormot.lib.curl;

var
  hnd: TCurl;
  url: RawUtf8;
  res: TCurlResult;
  buffer: RawByteString;
begin
  if not CurlIsAvailable then Exit; //=>

  hnd := curl.easy_init;
  if hnd <> Nil then
  begin
    // Schema: sftp://user:password@server/file.txt
    url := 'ftp.halifax.rwth-aachen.de/debian/README.html';

    // https://curl.se/libcurl/c/sftpget.html
    curl.easy_setopt(hnd, coURL, Pointer(url));
    curl.easy_setopt(hnd, coWriteFunction, @CurlWriteRawByteString);
    curl.easy_setopt(hnd, coWriteData, @buffer);
    res := curl.easy_perform(hnd);
    if res = crOk then
    begin
      FileFromString(buffer, MakePath([Executable.ProgramFilePath, 'file.txt']));
      ShowMessage('Download completed');
    end
    else
      ShowMessage(Format('Curl told us %d (%s)', [Ord(res), curl.easy_strerror(res)]));

    curl.easy_cleanup(hnd);
  end;
end;
Disclaimer: Ungetestet!

Ein Beispiel zum Studieren ist auch die Klasse TCurlHttp aus der Unit mormot.net.client.

Bis bald...
Thomas
  Mit Zitat antworten Zitat