File Uploads via Dropbox Api V2

12,564

I encourage you to use existing nodejs dropbox packages, which hides abstraction of an authentication process, etc. under the hood.

Check official dropbox-sdk-js or try my tiny package dropbox-v2-api. Quick example:

const dropboxV2Api = require('dropbox-v2-api');

//create session
const dropbox = dropboxV2Api.authenticate({
    token: 'TOKEN HERE'
});

//create upload stream
const uploadStream = dropbox({
    resource: 'files/upload',
    parameters: {
        path: '/dropbox/path/to/file.txt'
    }
}, (err, result) => {
    // upload completed
});

//use nodejs stream
fs.createReadStream('path/to/file.txt').pipe(uploadStream);
Share:
12,564
Skywalker
Author by

Skywalker

Updated on June 28, 2022

Comments

  • Skywalker
    Skywalker almost 2 years

    Previously I was using the Dropbox API V1 within my web app to upload files my dropbox account. Please note that the app uses only one dropbox account (mine) to upload files.

    So Previously:

    1. I created an app on the dropbox developers console
    2. Generated my token from the developers console
    3. Hard coded that token into my server to upload all file to a specific folder within my Dropbox.

    This worked perfectly before but as the dropbox API v1 has been deprecated it does not work anymore.

    Dropbox V1 Code:

    function fileupload(content) {
     request.put('https://api-content.dropbox.com/1/files_put/auto/my_reports/report.pdf', {
                headers: {
                    Authorization: 'TOKEN HERE',
                    'Content-Type': 'application/pdf'
                },
                body: content
            }, function optionalCallback(err, httpResponse, bodymsg) {
                if (err) {
                    console.log(err);
                }
                else {
                    console.log("File uploaded to dropbox successfully!");
                    fs.unlink(temp_dir + 'report.pdf', function(err) {
                        if (err)
                            throw err;
                        else {
                            console.log("file deleted from server!");
                        }
                    })
                    request.post('https://api.dropboxapi.com/1/shares/auto/MY_reports/report.pdf' + '?short_url=false', {
                        headers: {
                            Authorization: 'TOKEN HERE'
                        }
                    }, function optionalCallback(err, httpResponse, bodymsg) {
                        if (err) {
                            console.log(err);
                        }
                        else {
                            console.log('Shared link 2 ' + JSON.parse(httpResponse.body).url);
    
                        }
                    });
    
                }
            });
         }
    

    Dropbox V2 Code:

    function fileupload(content) {
     request.post('https://content.dropboxapi.com/2/files/upload/my_reports', {
                headers: {
                    Authorization: 'TOKEN HERE',
                    'Content-Type': 'application/pdf'
                },
                body: content
            } ......... (rest of the code is similar to above)
    

    Issue:

    What I have tried does not work. I can't seem to upload a file to my dropbox account from within my app. I have tried re-generating my TOKEN from the Dropbox App console but no luck.

    Can anyone tell me what am I doing wrong?

    Update:

    I updated my code to similar structure for v2 of the API but still unable to resolve it.

     request.post('https://content.dropboxapi.com/2/files/upload/', {
                    headers: {
                        Authorization: 'Bearer TOKEN',
                        'Dropbox-API-Arg': {"path": "/Homework","mode": "add","autorename": true,"mute": false},
                        'Content-Type': 'application/pdf'
                        //'Content-Type': 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
                    },
                    body: content
                } .... similar code