Мне нужно загрузить файл в Dropbox с axios. Вот мой код:

const uploadToExternalService = async function uploadToExternalService(token, content) {
        try {
            let res = await axios({
                url: 'https://api-content.dropbox.com/1/files_put/auto/'+'file_name',
                method: 'put',
                // timeout: 8000,
                headers: {
                    Authorization: 'Bearer ' + token,
                    'Content-Type': 'text/plain',
                    body: content
                }
            })
            if(res.status == 200){
                // test for status you want, etc
                console.log(res.status)
            }
            if(res.status == 400){
                console.log(res)
            }
            return res.data
        }
        catch (err) {
            console.error(err);
        }
    }

uploadToExternalService(SECRET_KEY, req.file).then(res => console.log(res));

Я получаю сообщение об ошибке Запрос не выполнен с кодом состояния 400

1
IgorM 18 Апр 2020 в 18:00

2 ответа

Лучший ответ

В конце концов мне удалось найти решение, используя dropbox-v2-api. Надеемся, что этот ответ предоставит полезный пример кода для других членов сообщества, хотя решение было реализовано без axios

import dropboxV2Api from "dropbox-v2-api";
import fs from "fs";

    // authentication
    const dropbox = dropboxV2Api.authenticate({
        token: DROPBOX_SECRET_KEY
    });

    //configuring parameters
    const params = Object.freeze({
        resource: 'files/upload',
        parameters: {
            path: '/file_name.docx'
        },
        readStream: fs.createReadStream(filePath)
        // filePath: path to the local file that we want to upload to Dropbox
    });

    let dropboxPromise = new Promise(function(resolve, reject) {
        dropbox(params, function(err, result) {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        });
    });

    await dropboxPromise.then(function (resultObj) {
        console.log("fileUpload_OK")
    }).catch(function(err){
        console.log(err.message)
    });

1
IgorM 20 Апр 2020 в 16:51

Вы используете API Dropbox v1, которые официально вышли из употребления. Почему бы не использовать v2?

Для вашей проблемы попробуйте отправить тело за пределы headers

headers: {
  Authorization: 'Bearer ' + token,
  'Content-Type': 'text/plain'
},
body: content

Исправленный код:

const uploadToExternalService = async function uploadToExternalService(token, content) {
        try {
            let res = await axios({
                url: 'https://api-content.dropbox.com/1/files_put/auto/'+'file_name',
                method: 'put',
                // timeout: 8000,
                headers: {
                    Authorization: 'Bearer ' + token,
                    'Content-Type': 'text/plain'
                },
                body: content
            })
            if(res.status == 200){
                // test for status you want, etc
                console.log(res.status)
            }
            if(res.status == 400){
                console.log(res)
            }
            return res.data
        }
        catch (err) {
            console.error(err);
        }
    }

uploadToExternalService(SECRET_KEY, req.file).then(res => console.log(res));
0
SpiritOfDragon 18 Апр 2020 в 15:41