0

Send file to dropbox

I'm using ninox cloud.

 

I have a file named MyFile.pdf as an attachment on my object (size is 84 KB). I can open it in Ninox without a problem. Then I have made a button. When I click the button I want my file to be sent to my Dropbox. (I have made a multitext-field called "Response" on my current object in which i write the response for debugging purposes.)

I have the following code in my Button:

let url := "https://content.dropboxapi.com/2/files/upload";
let token := "INSERT_DROPBOX_TOKEN";
let fileObj := file(this, "MyFile.pdf");
let dropboxArgString := "{""path"": ""/Ninox_Test/MyNewFile.pdf"",""mode"": ""add"",""autorename"": true,""mute"": false, ""strict_conflict"":true}";
do as server
    let response := http("POST", url, {
            Authorization: "Bearer " + token,
            'Content-Type': "application/octet-stream",
            'Dropbox-API-Arg': dropboxArgString
        }, fileObj);
    if response.error then
        Response := text(response.error)
    else
        Response := text(response.result)
    end
end

 

When I execute this it sends the file to dropbox and it appears in the correct folder. But when I want to open the file in dropbox it is corrupt. (When I download the file from dropbox it also can't open it and it has a size of 1 KB.)

Screenshot translated to english: "Dropbox supports .pdf-files, but something went wrong here."

Here's the dropbox API I reference: https://www.dropbox.com/developers/documentation/http/documentation#upload

Here's the ninox http-function I reference: https://docs.ninox.com/en/script/function-overview/functions/http

Can anybody help me to fix the problem?

Thanks in advance!

Tanja

 

P.S.: in Postman it works

17 Antworten

null
    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Tanja, das wird über diesen API Endpoint nicht gehen, da die Dropbox API file-content erwartet, Ninox aber keinen file-content liefert und auch nicht auf lokale Dateien zugreift. Die Dropbox API kann man aber mit dem Endpoint save_url ansprechen und dann aus der Ninox den Anhang via ShareFile anbieten...   

      • tanja_stamm
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Hallo T. Bartzsch 
      Vielen Dank für deine schnelle Antwort! Hat super geklappt mit save_url. Ich poste meine Lösung unterhalb. Danke für die Hilfe!
      Lg Tanja

    • tanja_stamm
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hier der Code, wie es bei mir funktioniert hat - Dank an T. Bartzsch. Der Code ist inklusive dem dynamischen FileTitle vom Dokument, welches im Bild-Feld "Rechnung" enthalten ist. Das Feld "Response" nutz ich als Debug-Info Feld -> ist nicht nötig.

    let url := "https://api.dropboxapi.com/2/files/save_url";
    let token := "INSERT_DROPBOX_TOKEN";
    let allFiles := files(this);
    let RechnungsFileTitle := last(split(text(Rechnung), "/"));
    let myFileURL := shareFile(this, RechnungsFileTitle);
    let myBody := {
            path: "/Ninox_Test/" + RechnungsFileTitle,
            url: myFileURL
        };
    do as server
        let response := http("POST", url, {
                Authorization: "Bearer " + token,
                'Content-Type': "application/json"
            }, myBody);
        if response.error then
            Response := text(response.error) + "\n; FileURL: " + myFileURL
        else
            Response := text(response.result) + "\n; FileURL: " + myFileURL
        end
    end
    

     

    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Freut mich, dass es klappt. Das einzige Manko bei Dropbox ist der asynchrone Upload... wenn man via Schleife durch seine Dateianhänge iteriert und jedes File hochlädt, braucht es jeweils ein sleep(1000) damit er sich nicht verschluckt... 

      • tanja_stamm
      • vor 1 Jahr
      • Gemeldet - anzeigen

      T. Bartzsch  Danke für den Tipp! Werde ich berücksichtigen, sobald ich mehrere Dateien iteriere. Liebe Grüsse Tanja

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ich kriege trotz sleep() als Response immer nur die Asychrone Job ID. Wie kriege ich stattdessen den Pfad der hochgeladenen Datei heraus?

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 1 Jahr
      • Gemeldet - anzeigen
      • Icarus_Ralf_Becker
      • vor 2 Wochen
      • Gemeldet - anzeigen

       Hallo Stefanie, an der Stelle komme ich nicht weiter. Als response erhalte ich nur den Parameter "tag" und "asynchrone_job_id". Wie bist du an die FileMetaData bzw. "path_lower" gekommen? Lieben Dank vorab.

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 2 Wochen
      • Gemeldet - anzeigen

       

      STATUS DES ASYNCHRONEN JOBS ABRUFEN

      Die Job-ID lasse ich in ein Feld namens "Asynch Job ID" schreiben. Am besten löst man den nächsten Schritt dann mit einem Trigger (Öffnen der Datenbank, Öffnen eines Reiters etc.) aus.

      Hinweis: API-Keys gibt es nur für Developer und Apps, die mehr als 50 User haben. Test-Tokens aus der App Console sind nur 4 Stunden gültig!
       

      do as server
      let url := "https://api.dropboxapi.com/2/files/save_url/check_job_status";
      let token := 'Dropbox API';
      let xDocs := select Tabelle;
      for i in xDocs do
          let xPath := "/HiermeinPfad/" + i.Name;
          let myBody := {
              async_job_id: i.'Asynch Job ID'
          };
          let response := http("POST", url, {
              Authorization: "Bearer " + token,
              'Content-Type': "application/json"
          }, myBody);
          let xResult := text(response.result);
          i.('Job Status' := xResult);
          if response.error then
              i.(Synchstatus := 3)
          else
              if contains(xResult, "complete") then
                  i.('Dropbox Document ID' := text(response.result.id));
                  i.('Dropbox Pfad' := text(response.result.path_lower));
                  i.('Dropbox Filename' := text(response.result.name));
                  "/// ShareLink erzeugen ///";
                  let response2 := http("POST", "https://api.dropboxapi.com/2/sharing/create_shared_link_with_settings", {
                      Authorization: "Bearer " + 'Dropbox API',
                      'Content-Type': "application/json"
                  }, {
                      path: i.'Dropbox Pfad',
                      settings: {
                          access: "viewer",
                          allow_download: true
                      }
                  });
                  if response2.error then
                      i.(Synchstatus := 3)
                  else
                      i.('Dropbox-Link' := item(response2.result, "url"));
                      i.(Synchstatus := 2);
                      i.('An Dropbox übertragen' := true);
                  end
              end
          end
      end
      end
      
      
      • Icarus_Ralf_Becker
      • vor 2 Wochen
      • Gemeldet - anzeigen

       vielen lieben Dank. Das hilft weiter. Im Übrigen kann man einen abgelaufenen Test-Token per API Call beliebig verlängern. Der Key bleibt erhalten, nur die Gültigkeit beginnt von vorn. Damit kann man einen Key unbegrenzt nutzen. 

      • Icarus_Ralf_Becker
      • vor 2 Wochen
      • Gemeldet - anzeigen

       

      let token := "asddfjwerui3904r23424fkfnwe9pr4u234892ß4jfnd.....";
          "
      ### Token refresh ###
      
      ";
          let url := "https://api.dropboxapi.com/oauth2/token";
          let myBody := {
                  access_token: token
              };
          let response := do as server
                  http("POST", url, {
                      Authorization: "Bearer " + token,
                      'Content-Type': "application/json"
                  }, myBody)
              end;
    • Michi.1
    • vor 1 Jahr
    • Gemeldet - anzeigen
    function fx_AnhangLoeschen(xUrl : text) do
        let Antwort := "";
        let vAPIKey := "***";
        let vHeader := {
                Authorization: "Bearer " + vAPIKey
            };
        let vUrl := xUrl;
        Antwort := text(http("DELETE", xUrl, vHeader, ""))
    end;
    ///--- alle nicht benötigten (sichtbaren)Anhänge löschen---///
    let Anhang_auslesen := for i in files(this) do
            let alleFileName := last(split(text(i), "/"));
            let BildfileName := last(split(text(Bild), "/"));
            let BildfileName1 := last(split(text('Bild 2'), "/"));
            let BildfileName2 := last(split(text('Bild 3'), "/"));
            let vergleich := unique(alleFileName);
            for r in vergleich do
                if BildfileName != r and BildfileName1 != r and BildfileName2 != r then
                    let vUrl := "https://api.ninoxdb.de/v1/teams/" + teamId() + "/databases/" + databaseId() +
                        "/tables/" +
                        tableId(this) +
                        "/records/" +
                        Nr +
                        "/files/" +
                        r;
                    fx_AnhangLoeschen(text(vUrl))
                end
            end
        end;
    ///--- alle files des Datensatzes zur Dropbox senden ---///
    let url := "https://api.dropboxapi.com/2/files/save_url";
    let token := "INSERT_DROPBOX_TOKEN";
    let allFiles := for i in files(this) do
    let RechnungsFileTitle := last(split(text(i), "/"));
    let myFileURL := shareFile(this, RechnungsFileTitle);
    let myBody := {
            path: "/Ninox_Test/" + RechnungsFileTitle,
            url: myFileURL
        };
    do as server
        let response := http("POST", url, {
                Authorization: "Bearer " + token,
                'Content-Type': "application/json"
            }, myBody);
        if response.error then
            Response := text(response.error) + "\n; FileURL: " + myFileURL
        else
            Response := text(response.result) + "\n; FileURL: " + myFileURL
        end
    end
    end;
    ///--- jetzt müßte man noch die in den Bildfeldern verbliebenen Daten löschen
    und einen sharelink von den daten auf der Dropbox eingebettet in ein iframe zurück bekommen.
    Dies muss dann auch von der Dropbox downlod fähig sein ///---
    

    Häng mich mal hier dran,

    bin absoluter neuling in der geschichte. Würde das im script gehen oder eher nicht? Hätte noch Make im Angebot (auch keinen schimmer davon) aber da wird es schnell Teuer. Doch die Daten müssen ausgelagert werden, sonst wird es auch Teuer.

    • Wegener & Hinz GmbH
    • green_cup
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Vielleicht kann mir jemand helfen, ich habe mit meinen Halbwissen versucht eine Datei in der Dropbox

    abzulegen:

    let url := "https://api.dropboxapi.com/2/files/save_url";
    let token := "sl.Bgcps5wudyRXvN_GfK48xoJ2xLqhDMFt-cJkWKUR5Xu6lZLnofmho1oIyor2tMPe7EYBA5CyIiaQtgapsOmo6M_tVs0lywjxB5QIYrbViuPunKxhzw";
    let myFileURL := shareFile(this, Datei);
    let myBody := {
            path: "/Ninox/" + Datei,
            url: myFileURL
        };
    do as server
        let response := http("POST", url, {
                Authorization: "gwd1zqjri4lnosl " + token,
                'Content-Type': "application/json"
            }, myBody);
        void
    end

    Aber was ist falsch? Die Variable "Datei" ist der Dateiname aus den DB-Feld.

    Das Unterverzeichnis auf Dropbox heißt: Ninox 

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 1 Jahr
      • Gemeldet - anzeigen

      I.R. Was kommt denn als Fehlermeldung? Lies mal text(response.result) in einem Feld aus.

      Bei "Authorization" muss  "Bearer " + token stehen. Der Token, beginnend mit "sl", ist nur für Testzwecke gedacht und daher immer nur vier Stunden gültig. Danach brauchst du einen neuen Token.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Error in call to API function "files/save_url": Your app is not permitted to access this endpoint because it does not have the required scope 'files.content.write'. The owner of the app can enable the scope for the app using the Permissions tab on the App Console.

       

      Das ist die Meldung

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Du musst in der Dropbox App Console unter "Permissions" die entsprechenden Rechte setzen.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Klar.....habe ich gar nicht bedacht.................DANKE

Content aside

  • Status Answered
  • vor 2 WochenZuletzt aktiv
  • 17Antworten
  • 342Ansichten
  • 7 Folge bereits