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

13 Antworten

null
    • T_Bartzsch
    • vor 11 Monaten
    • 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 11 Monaten
      • 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 11 Monaten
    • 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 11 Monaten
    • 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 11 Monaten
      • Gemeldet - anzeigen

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

      • Geschäftsführerin bei Kennes Digital
      • Stefanie_K
      • vor 10 Monaten
      • Gemeldet - anzeigen

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

      • Geschäftsführerin bei Kennes Digital
      • Stefanie_K
      • vor 10 Monaten
      • Gemeldet - anzeigen
    • Michi.1
    • vor 10 Monaten
    • 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 10 Monaten
    • 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 

      • Geschäftsführerin bei Kennes Digital
      • Stefanie_K
      • vor 10 Monaten
      • 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 10 Monaten
      • 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

      • Geschäftsführerin bei Kennes Digital
      • Stefanie_K
      • vor 10 Monaten
      • Gemeldet - anzeigen

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

      • Wegener & Hinz GmbH
      • green_cup
      • vor 10 Monaten
      • Gemeldet - anzeigen

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

Content aside

  • Status Answered
  • vor 10 MonatenZuletzt aktiv
  • 13Antworten
  • 248Ansichten
  • 6 Folge bereits