使用JavaScript从Dropbox下载文件

5

我有

我有一个网站,试图为客户提供从Dropbox下载文件的服务。为了开发简便,我使用Dropbox选择器。为此,我启用了我希望从中下载的域,并将Dropbox本身建议的<script>标签(具有相应的data-app-key)包含在我的HTML页面中。一切都很顺利。

问题

现在我需要下载用户选择的文件。 Dropbox选择器似乎没有提供任何此功能,它只是检索与文件相关的信息。在我的情况下,这是一个直接链接,以下载文件。

要下载文件,我似乎需要使用在另一个Dropbox JavaScript库//cdnjs.cloudflare.com/ajax/libs/dropbox.js/0.9.1/dropbox.min.js中定义的Dropbox.Client

因此,我运行以下代码来使用该库:

//OPTIONS FOR DROPBOX CHOOSER
var options = {
        linkType: "direct",

        // THIS FUNCITON RUNS WHEN USER SELECTS SOMETHING
        // FROM DOPBOX_CHOOSER
        success: function (files) {

            // DEFINE APP KET FOR DROPBOX_CLIENT (KEY, SECRET...), WHICH I GET
            // BY CREATING NEW "CORE API" TYPE:Full Dropbox APPLICATION ON 
            // DROPBOX APP CONSOLE 
            var appKey = { key: 'APP KEY', secret: 'CLIENT SECRET', sandbox: true };

            //INIT CLIENT
            var client = new Dropbox.Client(appKey);

            //TRY TO AUTHENTICATE IT
            client.authenticate(function (error, client) {
                if (error) {
                    console.log(error);
                }
                if (client.isAuthenticated()) {

                    //READ FILES 
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        client.readFile(file.link, function (error, data) {
                            if (error) {
                                return console.log(error);  // Something went wrong.
                            }

                            alert(data);  // data has the file's contents
                        });
                    }
                } else {
                    console.log("Error on authentication");
                }
            });


        },
        cancel: function () {

        }
    };

    //OPEN DROPBOX_CHOOSER
    Dropbox.choose(options);

但是所有这些都不能为我提供报告:

enter image description here

如果我不调用client.authenticate,我将无法下载文件,因为会收到“未经授权错误”通知。

问题

我该如何解决这个问题?

3个回答

3
一个简单明了的解决方案是使用XMLHTTP,如下所示。
function readDropbox(sURL) 
{
    var oRequest = new XMLHttpRequest();
    oRequest.open("GET",sURL,false);
    oRequest.onreadystatechange = function(oEvent) 
    {  
        if (oRequest.readyState === 4) 
        {  
            if (oRequest.status === 200) 
            {  
                console.log(oRequest.responseText)  
            } 
            else  
            {  
                console.log("Error", oRequest.statusText);  
            }  
        } 
    } 
    oRequest.setRequestHeader("User-Agent",navigator.userAgent); 
    try 
    {
        oRequest.send(null)
    } 
    catch (err) 
    {
        alert(err);
    }
    if (oRequest.status == 200) 
    {
        return oRequest.responseText;
    }
    else 
    {
        alert("Error - File not found in Dropbox public folder");
        return null;
    }
}

0

您不需要使用Dropbox.js从Chooser返回的链接下载文件。Dropbox.js是用于连接与Chooser分开的Dropbox Core API的库。client.readFile函数旨在接受授权的Dropbox帐户中文件的路径,而不是像您所拥有的文件URL。

由于您已经拥有无需身份验证即可访问所需文件的直接链接,因此可以通过平台提供的任何手段直接下载它。(一个简单的例子可能是在终端中使用curl。)


我想要在我的JavaScript中下载,所以我应该使用一些CORS调用技术。我的问题是,我是否可以在不手动实现代码的情况下实现这一点。 - Tigran

0
如果你想从客户端的 JavaScript 代码访问 Dropbox 文件的内容,我建议您使用服务器端来获取内容并将其发送回客户端(使用 Ajax 最为优雅)。
通常情况下,无法从 JavaScript 代码中访问当前域之外的任何 URL 的内容(例外是对外部 JavaScript 代码的引用)。

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