通过 Dropbox Api V2 进行文件上传

4

之前我在我的网站应用程序中使用了Dropbox API V1来上传文件到我的Dropbox账户。请注意,该应用程序仅使用一个Dropbox账户(即我的账户)来上传文件。

所以以前:

  1. 我在Dropbox开发者控制台上创建了一个应用程序
  2. 从开发者控制台生成了我的令牌
  3. 将该令牌硬编码到我的服务器中,以将所有文件上传到Dropbox中的特定文件夹。

这在以前完美地运作,但由于Dropbox API v1已被弃用,它现在无法正常工作。

Dropbox V1 代码:

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 代码:

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)

问题:

我尝试的方法不起作用。 我似乎无法从我的应用程序上传文件到我的Dropbox帐户中。 我已经尝试从Dropbox应用程序控制台重新生成了我的TOKEN,但没有成功。

有人能告诉我我做错了什么吗?

更新:

我将代码更新为API v2的类似结构,但仍然无法解决它。

 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

API v2和API v1的工作方式不同。例如,文件路径不是通过URL本身传递的,因此您需要更新代码以使用API v2样式。文档中有一个例子在这里:https://www.dropbox.com/developers/documentation/http/documentation#files-upload另外,请确保检查响应主体是否存在错误。 - Greg
@Greg 我尝试使用八位字节流内容类型,但没有成功。而且它也没有给我任何错误消息。我一定是哪里犯了错误。 - Skywalker
@Greg 抱歉我的错误,我没有记录响应。我得到了这个响应 body: 'Unknown API function: "files/upload/".' 响应包含更多数据。 - Skywalker
看起来您有一个额外的斜杠。请将URL更改为“'https://content.dropboxapi.com/2/files/upload'”。 - Greg
@Greg 如果我现在能拥抱你,我一定会的!谢谢你的帮助。兄弟。它起作用了! - Skywalker
显示剩余4条评论
2个回答

1
我建议您使用现有的nodejs dropbox包,它可以在幕后隐藏身份验证等抽象过程。请查看官方dropbox-sdk-js或尝试我的小型包dropbox-v2-api。以下是一个快速示例:
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);

0

我的建议是使用一个抽象身份验证的SDK。CloudRail for Node.js 在这里非常有用。它很容易使用,并且也适用于其他提供商,如OneDrive。

const cloudrail = require("cloudrail-si");

const service = new cloudrail.services.Dropbox(
    cloudrail.RedirectReceivers.getLocalAuthenticator(8082),
    "[Dropbox Client Identifier]",
    "[Dropbox Client Secret]",
    "http://localhost:8082/auth",
    "someState"
);

service.upload(
    "/myFolder/myFile.png",
    readableStream,
    1024,
    true,
    (error) => {
        // Check for potential error
    }
);

这里还有一篇关于{“error”: “v1_retired”}问题的简短文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接