0

我正在尝试将 Dropbox 中特定目录中的所有文件下载到我的 Web 服务器上的目录中,如果还没有同名文件的话。

我使用这个SitePoint 教程作为指南。

我遇到的问题是 Dropbox APIInvalid Signature在访问某些文件时返回错误。我看不出这些文件有什么奇怪或特别之处。有些是PDF,有些是PNG。

我读过这可能与 OAuth 相关,但我无法弄清楚。

我相信 中的错误getFile()foreach()具体取决于文件:

<?php
require_once "bootstrap.php";

if (!isset($access_token)) {
    header("Location: authorize.php");
    exit;
}

try {
    $session = new DropboxSession($config["dropbox"]["app_key"], $config["dropbox"]["app_secret"], $config["dropbox"]["access_type"], $access_token);

    $client = new DropboxClient($session);
    $path = "/Stuff/folder_to_download";
    $home = $client->metadata($path);

    foreach($home['contents'] as $item) {
        echo "<pre>" . print_r($item, true) . "</pre>";
        $path = $item['path'];

        if ( $item['is_dir'] == '1' )
            continue;

        // where to save it
        $dest = $config["app"]["datadir"] . "/" . basename($path);

        if ( file_exists($dest) ) {
            echo "<p>File <code>". $dest . "</code> already exists. Skipped.</p>";
            continue;
        }

        // Download file
        if ($file = $client->getFile($path, $dest)) {
            if (!empty($dest)) {
                unset($file["data"]);
                echo "<p>File saved to: <code>" . $dest . "</code></p>";
            }
        }
    }
}
catch (Exception $e) {
    echo "<strong>ERROR (" . $e->getCode() . ")</strong>: " . $e->getMessage();
}

?>

authorize.php文件看起来像这样bootstrap.php 看起来像这样

更新 1:我仍然无法解决此错误。我可以使用一组不同的 Dropbox/PHP 代码来代替这个站点点吗?

这是我删除 try/catch 时的原始错误:

Fatal error:  Uncaught exception 'Exception' with message 'Invalid signature.' in /myapp/lib/dropbox/rest.php:162
Stack trace:
#0 /myapp/lib/dropbox/rest.php(85): DropboxRESTClient->request('https://api-con...', 'GET', NULL, NULL, NULL, true)
#1 /myapp/lib/dropbox/session.php(278): DropboxRESTClient->get('https://api-con...', NULL, true)
#2 /myapp/lib/dropbox/client.php(106): DropboxSession->fetch('GET', 'https://api-con...', '/files/dropbox/...', Array, true)
#3 /myapp/download.php(54): DropboxClient->getFile('/Stuff/Droppod/...', '/myapp/...')
#4 {main}
  thrown in /myapp/lib/dropbox/rest.php on line 162

lib/dropbox/rest.php 文件在 GitHub 上供参考。

4

2 回答 2

0

“我仍然无法解决这个错误。我可以使用一组不同的 Dropbox/PHP 代码来代替这个站点点吗?”

关于这个问题,您可以尝试使用官方的 Dropbox PHP SDK:http ://dropbox.com/developers/core/sdks/php

于 2013-11-01T18:29:16.787 回答
0

遇到同样的问题,与一些在路径中具有特殊字符的文件夹/文件有关,例如“&”或“$”和“(”或“)”。建议您在对 api 进行 GET 查询之前对路径进行编码,否则您最终会得到这样的 url

https://api.dropbox.com/1/metadata/dropbox/Photos & Stuff ~ Jan 2013

而不是像这样正确编码

https://api.dropbox.com/1/metadata/dropbox/Photos%20%26%20Stuff%20~%20Jan%202013

编辑:这是我用于编码路径的代码(javascript)(就像一个魅力)

encodeURIComponent(p)
   .replace(/%2F/g, '/')
   .replace(/\)/g, '%29')
   .replace(/\(/g, '%28');
于 2013-11-01T00:33:35.903 回答