Javascript 通过Dropbox Api V2上传文件

Javascript 通过Dropbox Api V2上传文件,javascript,node.js,dropbox,dropbox-api,Javascript,Node.js,Dropbox,Dropbox Api,以前,我在我的web应用程序中使用Dropbox API V1将文件上载到我的Dropbox帐户。请注意,该应用程序仅使用一个dropbox帐户(我的)上载文件 所以之前: function fileupload(content) { request.put('https://api-content.dropbox.com/1/files_put/auto/my_reports/report.pdf', { headers: { Auth

以前,我在我的web应用程序中使用Dropbox API V1将文件上载到我的Dropbox帐户。请注意,该应用程序仅使用一个dropbox帐户(我的)上载文件

所以之前:

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);

                    }
                });

            }
        });
     }
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中的特定文件夹
  • 这在以前工作得很好,但由于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);
    
                        }
                    });
    
                }
            });
         }
    
    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 V2代码:

    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);
    
                        }
                    });
    
                }
            });
         }
    
    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)
    
    问题:

    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);
    
                        }
                    });
    
                }
            });
         }
    
    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应用程序控制台重新生成令牌,但没有成功。

    谁能告诉我我做错了什么

    更新:

    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);
    
                        }
                    });
    
                }
            });
         }
    
    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)
    
    我将代码更新为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
    

    我鼓励您使用现有的nodejs dropbox包,它隐藏了身份验证过程的抽象,等等

    检查官方或尝试我的小包裹。快速示例:

    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);
    

    我的建议也是使用一个SDK,它通过身份验证进行抽象。在这里可能非常有用。它非常容易使用,也适用于其他提供商,如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
        }
    );
    

    这里还有一个例子。

    APIv2的工作原理与APIv1不同。例如,文件路径不会传递到URL本身,因此您需要更新代码以使用API v2样式。这里的文档中有一个例子:另外,请确保检查响应正文是否有错误。@Greg请查看我更新的问题。这看起来更接近,但仍然与文档不匹配。例如,您应该将
    内容类型
    设置为
    应用程序/octet流
    。在任何情况下,请检查响应正文。它应该有一条更有用的错误消息。@Greg我尝试过使用八进制流内容类型,但没有成功。而且它没有给我任何错误信息。我肯定在什么地方犯了错误。