2

Bilddatenbanken

Im Forum habe ich einige Themen zu Bilddatenbanken gesehen. Ich habe mich schon einmal vor Jahren mit Ninox im Vergleich zu Filemaker mit diesem Thema beschäftigt. Es gibt mit Sicherheit durchaus geeignetere hochperfomante Bilddatenbankverwaltungsprogramme, die man aber leider nicht nach "Gusto"verändern kann. Das Filemaker Programm welches ich im Einsatz hatte, konnte Mitgliedsausweise; Schülerausweise herstellen. Das laden von Bilddaten in die Datenbank war per Stapelverarbeitung möglich. Bild- und Textdaten waren somit in einem Rutsch verbunden. sofern Bildreihenfolge mit der Reihenfolge in der .csv Tabelle übereinstimmt hat.

Scenario: In eine bestehende Datenbank sollen eine größere Mengen an Passbildern/Bilddaten (fortlaufend nummeriert in . jpg ) Geliefert eine.csv Tabelle und ein Ordner mit den Bildern. Die Verknüpfung ist die Datenbezeichnung Bild und ein in der Tabelle entsprechenden Datensatznummer. Bild und Person sollten übereinstimmen.

Das kann ich mit Ninox lösen. Allerdings nicht im Stapel, sondern nur manuell. Das ist bei wenigen Datensätzen kein Problem aber je nach "Schmerzgrenze" hat man dann keine Lust mehr, zumal es ja mal schneller ging. Auch die Darstellung im Druck (mehrere Datensätze (Ausweise)auf einem DINA4 Blatt) ist nicht so einfach.

Die Lösung die ich suche/wünsche, ist eine im Stapel verarbeitende Bildimportfunktion also ein Bildordner, der in einem Rutsch die Bilder in die Tabelle kopiert.  Die Bilddaten müssen für Ausweise nicht groß sein also eher "s" statt "xxl". Ich kann mir gut vorstellen, dass es auch noch andere Verwendungsarten gibt, als das erstellen von Ausweisen. z.B. Rapport Versicherungsschaden mit gelieferten großen Bildmengen (>100) die nachträglich in einer Datenbank mit Textdaten verarbeitet werden soll.

Das wäre schon cool.

25 Antworten

null
    • Thorsten_Cinco
    • vor 1 Jahr
    • Gemeldet - anzeigen

    ...also eine Funktion, die die Bilder, in einem Bildordner,  in einem Rutsch  in die Tabelle kopiert.

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ja, das leidige Thema.... Du hast also eine Datensatznummer in deiner Tabelle (X12345) und einen Ordner voller Bilder (X12345.jpg, X67890.jpg usw...)?

    Dann würde ich alle Bilddaten via FTP auf einen Webserver legen und in Ninox via import(this, "www.DEINSERVER.de/Bilder/" + Datensatznummer + ".jpg", Datensatznummer + ".jpg") darauf zugreifen. Wenn es jedoch mehrere Bilder pro Datensatz sind, musst Du einen Weg finden das Ganze in einer Schleife zu lösen...

    Du könntest eine Untertabelle mit den zu erwartenden Bildern anlegen, oder ein einfaches Textfeld mit den zugehörigen Bildnamen ("X1234-01.jpg, X1234-02.jpg, X1234-03.jpg").

    Wenn Du das für jeden Datensatz hast, kann man via for-Schleife durch die Untertabelle oder die einzelnen Einträge aus dem Textfeld iterieren und das entsprechende Bild vom FTP server ziehen. 

      • Thorsten_Cinco
      • vor 1 Jahr
      • Gemeldet - anzeigen

      T. Bartzsch 👍 So etwas in dieser Richtung. Es reicht vorerst 1 Bild pro Datensatz (Ausweise). Die Darstellung von Bildern aus dem Netz in der Datenbank habe ich schon anwenden können. Auch Links zu Dropbox. Möchte ich sie druckbar machen, muss ich sie in die Datenbank hochladen. Das geht allerdings nur manuell (Linkerstellung) und es ist leidig. Am liebsten würde ich Bilder die in der Dropbox lagern und automatisiert die Links abrufen aber das funktioniert  noch nicht. Ich kann mir gut vorstellen, dass es Anwender gibt, die z.B. ihre Bilddaten in Dropbox gelagert haben und jene gerne automatisiert in einer Ninox Datenbank abgebildet haben wollen. Je nach Bildmenge kann das womöglich Performance und Speicherplatz belasten und meine Idee ist eine temporäre (offline verfügbare) kleine Menge  (<1.000 ) auf der lokalen Festplatte bereitstellen und mit der man arbeitet und nach Projekt Beendigung wieder entfernt natürlich per Knopfdruck oder fester Termin (Datum). Das arbeiten mit FTP/Webserver ist auch eine Möglichkeit und ich teste gerade Mamp (lokal  per Apache) diese Übung läuft noch und da bin ich noch nicht soweit 🧐 (Pfaderstellung Terminal u.s.w).

      Vielleicht gibt es für Dropbox eine API die so etwas ermöglicht. Dropbox ist weit verbreitet und so eine Idee findet bestimmt Interesse.

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Wie gesagt, du kannst relativ Problemlos über importFile() Bilder die via URL erreichbar sind in die NINOX holen, entweder als Anhang - oder das importierte File direkt einem Bildfeld zuordnen. Das wäre bei deiner Aufgabenstellung mit je einem Bild schnell umzusetzen.

    Ich selber habe auch schon via API Bilder bzw. PDF Dateien in die Dropbox geladen - das klappt auch. 

    Was ich zuletzt noch umgesetzt habe, war ein komplettes Auslagern aller PDF Dokumente aus der Ninox nach Cloudinary - die haben ein Free-Angebot mit 20 od. 25 GB Speicher. Wenn du Dateien dort über die API ablegst, bekommst Du auch einen Sharelink zurück. Diesen lasse ich mir über ein mit iFrame eingebettetes PDF anzeigen. Das sieht dann so aus:

      • Arwin_Dustdar.1
      • vor 11 Monaten
      • Gemeldet - anzeigen

       ein bisschen ot aber wie macht man diese iframe Einbindung? Hast du eventuell dafür einen Link auf eine Anleitung? Oder gibt es etwas dazu in der Webinar DB?

      Thx

      • T_Bartzsch
      • vor 11 Monaten
      • Gemeldet - anzeigen

       hier weiter unten im Posting habe ich das ganze Prozedere mit cloudinary usw. aufgeführt. Der letzte Codeschnipsel ist das Formelfeld mit dem Cloudinary Sharelink als URL

      html("<embed iframe src=" + 'Cloudinary-Link' + " width=98% height=98%></iframe>")

      statt eines Link Feldes kannst du auch jede URL "hardcodiert" in das Script schreiben

      html("<embed iframe src='https://deinlink/deindokument.pdf' width=98% height=98%></iframe>")

    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Wenn man Pdf mit Bildern drucken möchte, rate ich zum dyn. Druck.
    Man kann hier, gegenüber der einfachen Druckausgabe, mit den ShareLinks der Bilder arbeiten und muss diese nicht vorab nach Ninox laden.

      • Thorsten_Cinco
      • vor 1 Jahr
      • Gemeldet - anzeigen

      T. Bartzsch 😳 Da staunt der Novize. Wenn es irgendwo ein Manual gibt, sehr UweG gerne, ansonsten taste ich mich heran. Im Webinar Vorlagen habe ich nichts dazu gefunden und dazu kommt noch als Neuling das erlernen von neuen Skripts. Es ist als lerne ich eine neue Fremdsprache und manches kommt mir bekannt vor. Vielen Dank für die Hilfen. 👍

      • Thorsten_Cinco
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG 🙏🏻 Da habe ich etwas im Webinar gefunden. Nach und nach kommen die Lösungswege. 

    • Thorsten_Cinco
    • vor 1 Jahr
    • Gemeldet - anzeigen
    T. Bartzsch said:
    Wenn du Dateien dort über die API ablegst, bekommst Du auch einen Sharelink zurück.

     Genau das möchte ich lernen. Geht die API auch mit dem Test-Account, den ich nun seit dieser Woche nutze? Wie ist das Prozedere? Cloudinary Account ist eröffnet und bereit zum testen. Gerne würde ich das auch mit Dropbox machen.

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ja, die API sollte auch mit dem Testaccount gehen... ich kann dir das Prozedere leider erst Anfang der Woche etwas ausführlicher erklären, bin am WE nicht am Rechner... Wenn man schon das Meer vor der Tür hat, dann muss man das auch nutzen :) 

      • Thorsten_Cinco
      • vor 1 Jahr
      • Gemeldet - anzeigen

      T. Bartzsch Surfen geht natürlich vor und auch andere Vorzüge des Aufenthaltes am Meer, vor allem das Atmen der guten Seeluft (Aerosol🙂). Ich bin sowieso verwundert, über die schnelle Reaktionen hier im Forum und auch über die Angebote und Hinweise mit denen ich schon einen deutlichen Schritt nach vorne gemacht habe. Es sieht nach einer coolen Geschichte aus. Nächste Woche kann kommen, vorab natürlich das wohl verdiente WE.

      🙏

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Bei mir sind es dann eher die Aerosole - wobei hier in der 1.Linie in S'Arenal auch noch einiges Andere durch die Luft schwebt...

    Also, zum Ablauf des Hochladens auf Cloudinary:

    Du musst - wenn du dich da registriert hast - zunächst unter SETTINGS / UPLOAD ein Upload preset anlegen. Dieses nennst du dann zB NinoxUpload ... der Signing Mode ist "unsigned", Use filename or externally... kann auf "on"

    Api Key und den Cloudname findest du im Dashboard bei Cloudinary.

    In deiner Ninox Datenbank brauchst du ein mehrzeiliges Textfeld "Cloudinary_API", ein URL Feld "Cloudinary-Link" und dein Bildfeld in dem das auszulagernde PDF liegt (man kann auch durch alle Dateianhänge gehen und die der Reihe nach hochladen, da muss man die Formel umbauen) - bei mir heisst das Bildfeld "PDF"... auf einen Button legst Du dann folgendes Script:

    let Bildlink := shareFile(PDF);
    let data := {
    file: Bildlink,
    folder: "UNTERORDNER",
    upload_preset: "NinoxUpload",
    public_id: item(split(replace(text(PDF), ".pdf", ""), "/"), 1),
    api_key: "DEINAPIKEY"
    };
    Cloudinary_API := "Sende Daten an Cloudinary...";
    do as server
    let response := http("POST", "https://api.cloudinary.com/v1_1/DEINCLOUDNAME/auto/upload", data);
    Cloudinary_API := text(response);
    'Cloudinary-Link' := text(response.result.secure_url);
    end;

    Jetzt müsste das Bild auf Cloudinary liegen. 

    Jetzt macht aber eine Automatik keinen Sinn, wenn Du manuell das Bild aus der Ninox löschen müsstest - also löschen wir den Dateianhang über die Ninox API (das ist die unelegante Lösung mit hardcodierter URL ohne teamId() und databseId() ...). Deinen Ninox API Key machst/findest Du auf der Ninox DB Startseite, wo du rechts die Infos über dein Abo hast, oben unter dem Zahnrad -> Integrationen...

    let myFile := urlEncode(item(split(text(files(this)), "/"), 1));
    let myId := number(this);
    let auth := {
    Authorization: "Bearer DEINTOKEN",
    'Content-Type': "application/json"
            };
    do as server
    http("DELETE", "https://api.ninoxdb.de/v1/teams/DEINETEAMID/databases/DEINEDATENBANKID/tables/A/records/" +
    myId + "/files/" + myFile, auth, {})
     end

    Jetzt ist der original-Anhang aus dem Datensatz gelöscht (wenn es nur einen Anhang gegeben hat. Falls mehrere Anhänge existieren, z.B. noch ein weiteres Bild oder PDF ... muss man etwas vorsichtiger beim löschen über die API sein...

    Du kannst das jetzt das Ursprungsbild/PDF im Bildfeld noch durch eine niedrige aufgelöste Vorschau von Cloudinary ersetzen, das kostet allerdings eine weitere Cloudinary "Transaktion" (du hast aber genug). dazu einfach nach dem "end;" im obigen Script noch diese beiden Zeilen einfügen:

    sleep(1000);
    PDF := importFile(this, replace(replace('Cloudinary-Link', "upload/", "upload/c_scale,w_300/"), ".pdf", ".jpg"));

    So, jetzt hast du dein Original Bild/PDF auf Cloudinary, hast deinen Ninox Anhang gelöscht und u.U. ein kleines Vorschaubild von Cloudinary in Ninox abgelegt. Jetzt kannst Du dir in einem Formel-Feld noch via iFrame das Original auf Cloudinary über den Link anzeigen lassen:

    html("<embed iframe src=" + 'Cloudinary-Link' + " width=98% height=98%></iframe>")
      • Thorsten_Cinco
      • vor 1 Jahr
      • Gemeldet - anzeigen

      T. Bartzsch Was für ein Community Support! Super und herzlichen Dank. Da ich ziemlich am Anfang stehe und meine "Coding" Fähigkeiten eher rudimentär vorhanden sind, bedarf es noch etwas Einarbeitungszeit und Übung bis ich dann einen Level erreicht habe, der das alles flüssiger voranbringt. Ich finde es wirklich großartig, wie hier an Lösungen gearbeitet und Wissen geteilt wird. Ich habe schon eine kleine Ninox-Anwendung (Terminbestätigungen) beisammen, die ich zum Einsatz bringen könnte. Jene  wird parallel zum bisherigen System zum Einsatz kommen und dann wird man sehen, wie es sich bewährt. Deine Lösung werde ich trainieren und gebe Dir Bescheid. Wird aber noch dauern.

      • T_Bartzsch
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Thorsten  Geduld... Rom ist ja auch nicht.... usw. Das Forum ist hier auf jeden Fall ein sehr wichtiger Beitrag für die positive Entwicklung der Lernkurve. Auch wenn das alles auf den ersten Blick kryptisch und verwirrend aussieht - am Ende ist es doch immer das Gleiche: Variablen definieren, Daten zusammen suchen und damit irgendetwas machen ... und am Ende führen viele Straßen nach Rom. Womit sich der Kreis  (zumindest in diesem Post) schließt. :) 

      • Thorsten_Cinco
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Just for Info

      Lösung gefunden!

      Transmit ( https://panic.com/transmit) ist ein Tool für Mac- User um Dateien zu "schaufeln" Macht Spass und funktioniert. Es gibt bestimmt auch etwas wir Microsoft Anwender. 

      In Transmit gibt es die Möglichkeit die Links (massenweise) der Dateien (DropBox) zu kopieren 😎 und dann z.B. in eine Tabelle einzufügen. Die Bild ID wird in der Tabelle mit aufgeführt . Das ist ein manueller Vorgang, der aber je nach ID Beschaffung, eine kleine Rechneroperation in der Tabelle ist. Dann kann eine CSV Datei in die Tabelle einer Ninox Datenbank eingepflegt werden, entweder um bestehende zu ergänzen,(aktualisieren) oder neue Ds zu erzeugen und das anhand der ID.

      Ist natürlich ein Handling aber so kann ich ganz viele Links jeweils einem Ds zuordnen. In einem Rutsch.

      • Michi.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Grüß dich,

      deine Anleitung ist super. Aber ich kommen jetzt schon an meine Grenzen. Ich muss aus Platzgründen die Dateien (pdf & jpg) auslagern. Eine Datei bekomm ich hin, ich hab aber bis zu 11 in einem Datensatz.

      Der Ablauf soll folgender sein:

      Datein werden in die Bildfelder gezogen.

      Mit der Betätigung des Buttons sollen alle Datein umbenant werden und die nicht mehr benötigten "Kopien" entfernt werden. (Klappt)

      Jetzt sollen alle Datein per mail (MAKE) versendet werden. (Klappt)

      im Anschluss sollen die Dateien ausgelagert werden, der ShareLink aus der Response zurück zu den jeweiligen Dateien geschrieben werden, um so 11 fxfelder via iFrame zu befüllen. Wobei das iFrame für die Abrechnung die pdf Scrollbar  sein muss.  Alle Anhänge sind am ende gelöscht. (Klappt nicht)

      Dann soll es noch einen Button geben, der mir bei Bedarf wieder alle Dateien in die betreffenden Bildfelder zurück lädt. (Klappt nicht)

      Die einzelnen jpg bekomme ich zurück von Cloudinary, jedoch scheinen pdf geblockt zu sein???

      Hab mal eine DB angehangen.

      Würde mich über Hilfe sehr freuen.

      Danke Michi

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Kurz auf die schnelle, ich habe heute etwas Zeitdruck... PDF und ZIP unter Einstellungen, Sicherheit aktivieren...

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ansonsten, wenn ein Bild geht... das Ganze Prozedere in eine for-Schleife setzen:

    for i in files(this) .....

      • Michi.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

      soweit so gut,

      es werden alle Dateien hochgeladen. Doch wie bekomme ich den ganzen Vorgang mit den entsprechenden Url´s der Dateien zurück in Ninox und den dazugehörigen Feldern so das sie als iFrame dargestellt werden können?

      for i in files(this) do
          let alleFileName := last(split(text(i), "/"));
          let BildfileName := last(split(text(Abrechnung), "/"));
          let BildfileName1 := last(split(text(Bild1), "/"));
          let BildfileName2 := last(split(text(Bild2), "/"));
          let BildfileName3 := last(split(text(Bild3), "/"));
          let BildfileName4 := last(split(text(Bild4), "/"));
          let BildfileName5 := last(split(text(Bild5), "/"));
          let BildfileName6 := last(split(text(Bild6), "/"));
          let BildfileName7 := last(split(text(Bild7), "/"));
          let BildfileName8 := last(split(text(Bild8), "/"));
          let BildfileName9 := last(split(text(Bild9), "/"));
          let BildfileName10 := last(split(text(Bild10), "/"));
          let Bildlink := shareFile(i);
          let uploadkey := first(select NinoxKeys).text(CloudinaryUpload);
          let ninoxkey := first(select NinoxKeys).text(NinoxAPI);
          let cloudikey := first(select NinoxKeys).text(CloudinaryAPI);
          let webhook := first(select NinoxKeys).text(WebhookCloudinary);
          let data := {
                  file: Bildlink,
                  folder: "UNTERORDNER",
                  upload_preset: uploadkey,
                  public_id: alleFileName,
                  api_key: ninoxkey
              };
          'RückgabeCloudinary' := cloudikey;
          do as server
              let response := http("POST", webhook, data);
              "//
              //alle files werden ausgelagert, doch wie bekomme ich das
              //kommplette ergebniss in text(response) und wie kann ich die
              //jeweiligen url den feldern in Ninox zuordnen
              //";
              'RückgabeCloudinary' := text(response);
              linkAbrechnung := text(response.result.secure_url);
              linkBild1 := text(response.result."???????????);
              linkBild2:=text(response.result.???????????);
              linkBild3:=text(response.result.???????????);
              linkBild4:=text(response.result.???????????);
              linkBild5:=text(response.result.???????????);
              linkBild6:=text(response.result.???????????);
              linkBild7:=text(response.result.???????????);
              linkBild8:=text(response.result.???????????);
              linkBild9:=text(response.result.???????????);
              linkBild10:=text(response.result.???????????")
          end;
          let myFile := urlEncode(item(split(text(files(this)), "/"), 1));
          let myId := number(this);
          let auth := {
                  Authorization: ninoxkey,
                  'Content-Type': "application/json"
              };
          void
      end
      
    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    lass doch "response" ... welches ja die API Antwort von Cloudinary enthält mal in ein Mehrzeiliges Textfeld fliessen

    Textfeld := text(response)

    da siehst du, dass "response.result.secure_url" den link enthält. 

    Ich würde aber nicht mit Bildfeldern arbeiten - lege dir eine Untertabelle mit den Anhängen an und lasse Ninox für jede Datei einen neuen Eintrag in der Untertabelle machen. Darin ist dann nur das iFrame, ein Linkfeld .... und ggf. ein Bildfeld mit einer kleinen 300px Vorschau die von Cloudinary kommt.

    Ich kann heute leider nur sehr knapp antworten, sorry...

      • Michi.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

      alles gut, kein Stress

      Muss das ganze dann in die produktive Datenbank einfügen, die kann ich nicht mehr ändern. Just in dieser Tabelle brauche ich alle Ansichten in einem Formular. (ein Vorgang) die anderen Tabellen sind so aufgebaut wie du schreibst. (1 Datei=1Record in der dazugehörigen Untertabelle)

      Das Problem was ich habe ist das die Response welche in ein mehrzeiliges Textfeld geschrieben wird, nur den letzten Rückgabewert von Cloudinary enthält. 

      Bei zb. 3 Dateien werden 3 Dateien gesendet, es kommt 3-mal der Rückgabewert. Dieser müsste aber zusammengesetzt werden als Array und dann erst in das Textfeld geschrieben werden, so dass man alle URL´s auslesen kann.

      {"result":{"asset_id":"57333195716b8e3bddf3930a0a0f6bdb","public_id":"UNTERORDNER/20230607_093940.jpg","version":1686814467,"version_id":"a55285643ff0631ace26d03bf4880b08","signature":"30df360795850238c0858fba1558ddddfcc922cc","width":4032,"height":1908,"format":"jpg","resource_type":"image","created_at":"2023-06-15T07:34:27Z","tags":[],"bytes":2580539,"type":"upload","etag":"b160fa1c531be1ef6cc8a1b86fb6b04c","placeholder":false,"url":"http://res.cloudinary.com/*****/image/upload/v1686814467/UNTERORDNER/20230607_093940.jpg.jpg","secure_url":"https://res.cloudinary.com/*****/image/upload/v1686814467/UNTERORDNER/20230607_093940.jpg.jpg","folder":"UNTERORDNER","access_mode":"public","existing":true}}

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    OK.... ja, dann schreib dir den Rückgabewert innerhalb der Schleife immer wieder in die gleiche Variable und hänge noch ein Trennzeichen an, damit du das später mit split trennen kannst..

    rückgabe := rückgabe + "#" + text(response....usw)

      • Michi.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

      bekomm das nicht hin 😔

      • Michi.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Bekomm das nur so zum Laufen. Doch da muss ich das 11 mal durchlaufen lassen 😳 Geht das nicht anders? Hab aber null Dunst davon.

      let BildfileName := last(split(text(Abrechnung), "/"));
      let Bildlink := shareFile(Abrechnung);
      let uploadkey := first(select NinoxKeys).text(CloudinaryUpload);
      let ninoxkey := first(select NinoxKeys).text(NinoxAPI);
      let cloudikey := first(select NinoxKeys).text(CloudinaryAPI);
      let webhook := first(select NinoxKeys).text(WebhookCloudinary);
      let data := {
              file: Bildlink,
              folder: "UNTERORDNER",
              upload_preset: uploadkey,
              public_id: BildfileName,
              api_key: ninoxkey
          };
      do as server
          let response := http("POST", webhook, data);
          responseAbrechnung := text(response);
          linkAbrechnung := text(response.result.secure_url)
      end;
      let BildfileName1 := last(split(text(Bild1), "/"));
      let Bildlink := shareFile(Bild1);
      let uploadkey := first(select NinoxKeys).text(CloudinaryUpload);
      let ninoxkey := first(select NinoxKeys).text(NinoxAPI);
      let cloudikey := first(select NinoxKeys).text(CloudinaryAPI);
      let webhook := first(select NinoxKeys).text(WebhookCloudinary);
      let data := {
              file: Bildlink,
              folder: "UNTERORDNER",
              upload_preset: uploadkey,
              public_id: BildfileName1,
              api_key: ninoxkey
          };
      do as server
          let response := http("POST", webhook, data);
          responseBild1 := text(response);
          linkBild1 := text(response.result.secure_url)
      end;
      let BildfileName2 := last(split(text(Bild2), "/"));
      let Bildlink := shareFile(Bild2);
      let uploadkey := first(select NinoxKeys).text(CloudinaryUpload);
      let ninoxkey := first(select NinoxKeys).text(NinoxAPI);
      let cloudikey := first(select NinoxKeys).text(CloudinaryAPI);
      let webhook := first(select NinoxKeys).text(WebhookCloudinary);
      let data := {
              file: Bildlink,
              folder: "UNTERORDNER",
              upload_preset: uploadkey,
              public_id: BildfileName2,
              api_key: ninoxkey
          };
      do as server
          let response := http("POST", webhook, data);
          responseBild2 := text(response);
          linkBild2 := text(response.result.secure_url)
      end