Проблемы внедрения API Dropbox в PHP

Я пытаюсь создать страницу, которая будет отображать содержимое папки dropbox в виде презентабельной песочницы и позволять пользователю, просматривающему сайт (который вошел на веб-сайт, который я разрабатываю), иметь возможность щелкать и загружать различные файлы. в папках. Вот код, который я использую: Это файл bootstrap.php...

    <?php
// Prevent calling this script directly
if ($_SERVER["SCRIPT_FILENAME"] == __FILE__) {
    exit("Access denied!");
}

// app settings
$config = array();
$config["dropbox"]["app_key"] = "***";
$config["dropbox"]["app_secret"] = "***";
// ACCESS_TYPE should be "dropbox" or "app_folder"
$config["dropbox"]["access_type"] = "dropbox";

$config["app"]["root"] = ((!empty($_SERVER["HTTPS"])) ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"] . "/";
$config["app"]["datadir"] = dirname(__FILE__) . "/data";
$config["app"]["authfile"] = $config["app"]["datadir"] . "/auth.php";

// turn on error reporting for development
error_reporting(E_ALL|E_STRICT);
ini_set("display_errors", true);

// environment check
if (!is_dir($config["app"]["datadir"]) || !is_writable($config["app"]["datadir"])) {
    exit("The data directory is not writeable!");
}
if (file_exists($config["app"]["authfile"]) && !is_writable($config["app"]["authfile"])) {
    exit("The auth storage file is not writeable!");
}

// Load libraries and start a new session
require_once "lib/dropbox/rest.php";
require_once "lib/dropbox/session.php";
require_once "lib/dropbox/client.php";

if(!isset($_SESSION)){session_start();}

// Search for a previously obtained access token
$access_token = null;
if (file_exists($config["app"]["authfile"])) {
    include_once $config["app"]["authfile"];
}

Это файл authorize.php...

<?php
require_once "bootstrap.php";

if (isset($access_token)) {
    header("Location: ./");
    exit;
}

try {
    // Start a new Dropbox session
    $session = new DropboxSession(
        $config["dropbox"]["app_key"],
        $config["dropbox"]["app_secret"],
        $config["dropbox"]["access_type"]
    );

    // The user is redirected here by Dropbox after the authorization screen
    if (!empty($_GET["oauth_token"]) && !empty($_GET["uid"])) {
        $uid = $_GET["uid"];
        $token = array(
            "oauth_token" => $_GET["oauth_token"],
            "oauth_token_secret" => ""
        );

        if (!empty($_SESSION["request_token"])) {
            $token["oauth_token_secret"] = $_SESSION["request_token"]["oauth_token_secret"];
        }

        /**
         * The access token is all you'll need for all future API requests on
         * behalf of this user, so you should store it away for safe-keeping 
         * (even though we don't for this article). By storing the access
         * token, you won't need to go through the authorization process again
         * unless the user revokes access via the Dropbox website.
         */
        if ($access_token = $session->obtainAccessToken($token)) {
            parse_str($access_token, $token);
            $access_token = $token;
            unset($token);

            // The output ov var_export is similar to:
            // array("oauth_token_secret" => "aaaa", "oauth_token" => "bbbb", "uid" => "123456")
            $data = '<?php $access_token = ' . var_export($access_token, true) . ";";
            if (file_put_contents($config["app"]["authfile"], $data) === false) {
                throw new Exception("Unable save access token");
            }

            // Authorized, redirect to index
            //header("Location: index_inside.php");
            echo "Authorized, <a href=\"list.php\">click here</a> to redirect!";
            exit;
        }
        // The access token should be stored somewhere to be reused until
        // it expires or is revoked by the user
    }
    else {
        // We must start a new authorization cycle
        if ($request_token = $session->obtainRequestToken()) {
            // The request token must be subdivided in the two components 
            // oauth_token_secret and oauth_token and kept in the session
            // because is needed in the next step
            parse_str($request_token, $token);
            $_SESSION["request_token"] = $token;

            $url = $session->buildAuthorizeURL(
                $token, 
                $config["app"]["root"] . basename($_SERVER["SCRIPT_NAME"]),
                "en-US");

            // Display or redirect to auth URL
            echo '<p>Please visit <a href="' . $url . '">Dropbox</a> and authorize this application.</p>';
            exit;
        }
        else {
            throw new Exception("Unable to get request token");
        }
    }
}
catch (Exception $e) {
    echo $e->getMessage();
}

Это файл list_inside.php... который в конечном итоге включается для представления списка папок (и в идеале файлов со ссылками на скачивание)...

<?php
require_once "bootstrap.php";

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

try {
    // Start a new Dropbox session
    // The access token should be defined
    // The session should verify if the token is valid and throw an exception
    $session = new DropboxSession(
        $config["dropbox"]["app_key"], 
        $config["dropbox"]["app_secret"], 
        $config["dropbox"]["access_type"], 
        $access_token
    );
    $client = new DropboxClient($session);

    $path = (!empty($_GET["path"])) ? $_GET["path"] : "/Apps/Tools/";

    // List contents of home directory
    if ($home = $client->metadata($path)) {
        echo "<p>Metadata content for <code>" . $path . "</code></p>";
        echo "<pre>" . print_r($home, true) . "</pre>";
    }
}
catch (Exception $e) {
    echo "<strong>ERROR (" . $e->getCode() . ")</strong>: " . $e->getMessage();
    if ($e->getCode() == 401) {
        // Remove auth file
        unlink($config["app"]["authfile"]);
        // Re auth
        echo '<p><a href="authorize.php">Click Here to re-authenticate</a></p>';
    }
}

Вот вывод приведенного выше кода с использованием metadata():

Содержимое метаданных для /Apps/Tools/ Array ( [hash] => fa7f3577894553ffeb70ac0d96e49b99 [revision] => 71425 [rev] => 1170104ef29f8 [thumb_exists] => [байты] => 0 [изменено] => вт, 14 января 2014 г. 03:10:05 +0000 [path] => /Apps/Tools [is_dir] => 1 [icon] => папка [root] => dropbox [contents] => Array ( [0] => Array ( [revision] => 71426 [rev] => 1170204ef29f8 [thumb_exists] => [bytes] => 0 [изменено] => вт, 14 января 2014 03:10:05 +0000 [path] => /Apps/Tools/Burnside Road Dry Creek Valley Cabernet Sauvignon [is_dir] => 1 [icon] => папка [root] => dropbox [размер] => 0 байт)

        [1] => Array
            (
                [revision] => 71436
                [rev] => 1170c04ef29f8
                [thumb_exists] => 
                [bytes] => 0
                [modified] => Tue, 14 Jan 2014 03:10:05 +0000
                [path] => /Apps/Tools/Burnside Road Dry Creek Valley Sauvignon Blanc
                [is_dir] => 1
                [icon] => folder
                [root] => dropbox
                [size] => 0 bytes
            )

        [2] => Array
            (
                [revision] => 71445
                [rev] => 1171504ef29f8
                [thumb_exists] => 
                [bytes] => 0
                [modified] => Tue, 14 Jan 2014 03:10:05 +0000
                [path] => /Apps/Tools/Burnside Road Mendocino County Zinfandel
                [is_dir] => 1
                [icon] => folder
                [root] => dropbox
                [size] => 0 bytes
            )

        [3] => Array
            (
                [revision] => 71454
                [rev] => 1171e04ef29f8
                [thumb_exists] => 
                [bytes] => 0
                [modified] => Tue, 14 Jan 2014 03:10:05 +0000
                [path] => /Apps/Tools/Burnside Road Pinot Noir California
                [is_dir] => 1
                [icon] => folder
                [root] => dropbox
                [size] => 0 bytes
            )



    )

[size] => 0 bytes )

Я прошу прощения за изменчивый код, я не очень опытен в этом, однако, мой друг нуждается в помощи с сайтом, и я вскочил, чтобы помочь работе Dropbox.

Проблема в том, что... Он отображает массив информации о папках, но файлы не видны со ссылками для скачивания.

Добавлена ​​информация... есть другой код страницы, который я пробую: (я перечисляю вывод для этого прямо под php)

<?php
require_once "bootstrap.php";

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

try {
    // Start a new Dropbox session
    // The access token should exist
    // The session should verify if the token is valid and throw an exception
    $session = new DropboxSession(
        $config["dropbox"]["app_key"], 
        $config["dropbox"]["app_secret"], 
        $config["dropbox"]["access_type"], 
        $access_token
    );

    $client = new DropboxClient($session);
    $path = (!empty($_GET["path"])) ? $_GET["path"] : "/webs.pdf";
    $dest = $config["app"]["datadir"] . "/" . basename($path);

    // Download a file
    if ($file = $client->getFile($path, $dest)) {

        if (!empty($dest)) {
            unset($file["data"]);
            echo "<p>File saved to: <code>" . $dest . "</code></p>";
            echo "<pre>" . print_r($file, true) . "</pre>";
        }
        else {
            header("Content-type: " . $file["mime"]);
            echo $file["data"];
            exit;
        }
    }
}
catch (Exception $e) {
    echo "<strong>ERROR (" . $e->getCode() . ")</strong>: " . $e->getMessage();
    if ($e->getCode() == 401) {
        // Remove auth file
        unlink($config["app"]["authfile"]);
        // Re auth
        echo '<p><a href="authorize.php">Click Here to re-authenticate</a></p>';
    }
}

Вот вывод для приведенного выше кода:

Файл сохранен в: /home/thisisyo/public_html/data/webs.pdf Array ( [name] => /home/thisisyo/public_html/data/webs.pdf [mime] => application/pdf [meta] => stdClass Object ( [revision] => 35075 [rev] => 890304ef29f8 [thumb_exists] => [bytes] => 703289 [Изменено] => Четверг, 20 июня 2013 23:39:10 +0000 [client_mtime] => Среда, 20 февраля 2013 19:19:42 +0000 [path] => /webs.pdf [is_dir] => [icon] => page_white_acrobat [root] => dropbox [mime_type] => application/pdf [size] => 686,8 КБ)

)

Кроме того, вот класс, определенный в client.php:

public function metadata($path, $list = true, $fileLimit = 10000, $hash = null, $revision = null, $includeDeleted = false) {
    // Prepare argument list
    $args = array(
        "file_limit" => $fileLimit,
        "hash" => $hash,
        "list" => (int) $list,
        "include_deleted" => (int) $includeDeleted,
        "rev" => $revision
    );

    // Prepend the right access string to the desired path
    if ("dropbox" == $this->accessType) {
        $path = "dropbox" . $path;
    }
    else {
        $path = "sandbox" . $path;
    }

    // Execute
    $response = $this->Session->fetch("GET", $this->dropboxAPIURL, "/metadata/" . $path, $args);
    return $response["body"];
}

Это определение класса getFile()...

публичная функция getFile ($ path, $ outFile = null, $ revision = null) {

$args = array();
if (!empty($revision)) {
    $args["rev"] = $revision;
}

// Prepend the right access string to the desired path
if ("dropbox" == $this->accessType) {
    $path = "dropbox" . $path;
}
else {
    $path = "sandbox" . $path;
}

// Get the raw response body
$response = $this->Session->fetch("GET", $this->dropboxContentAPIURL, "/files/" . $path, $args, true);

if ($outFile != null) {
    if (file_put_contents($outFile, $response["body"]) === false) {
        throw new Exception("Unable to write file '$outfile'");
    }
}

return array(
    "name" => ($outFile) ? $outFile : basename($path),
    "mime" => $response["headers"]["content-type"],
    "meta" => json_decode($response["headers"]["x-dropbox-metadata"]),
    "data" => $response["body"]
);

}

2 ответа

Вам просто нужно вызвать функцию для загрузки файла.

require_once 'dropbox/DropboxClient.php';
$dropbox = new DropboxClient(array(
        'app_key' => DROPBX_API_KEY, 
        'app_secret' => DROPBX_API_SECRET,
        'app_full_access' => TRUE,
),'en');
$fileMetadata = $dropbox->DownloadFile($value->path,'download/'.$file);

проверьте это, если это может помочь вам

Для вашей страницы list_inside.php все, что вам нужно сделать, это перебрать $client->metadata() массив и распечатать HTML. Вот пример для этой страницы:

<?php

require_once "bootstrap.php";

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

try {
    // Start a new Dropbox session
    // The access token should be defined
    // The session should verify if the token is valid and throw an exception
    $session = new DropboxSession(
        $config["dropbox"]["app_key"], 
        $config["dropbox"]["app_secret"], 
        $config["dropbox"]["access_type"], 
        $access_token
    );
    $client = new DropboxClient($session);

    $path = (!empty($_GET["path"])) ? $_GET["path"] : "/Apps/Tools/";

    // List contents of home directory
    if ($home = $client->metadata($path)) {
        echo <<<EOF
        <h1>Index of $index</h1>

        <table>
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Last Modified</th>
                    <th>Size</th>
                    <th>Type</th>
                </tr>
            </thead>
            <tbody>
        EOF;

        foreach($home as $list) {
            $link = ($list[is_dir] == 1 ? "list_inside" : "download").".php?path=".$list[path];
            $file = explode("/", $list[path]);
            $path = $file[count($file)-1];
            $size = ($list[bytes] == 0 ? "-" : $list[size]);

            echo <<<EOF
                <tr>
                    <td><a href="$link">$path</a></td>
                    <td>$list[modified]</td>
                    <td>$size</td>
                    <td>$list[type]</td>
                </tr>
            EOF;
        }

        echo <<<EOF
            </tbody>
        </table>
        EOF;
    }
} catch (Exception $e) {
    echo "<strong>ERROR (" . $e->getCode() . ")</strong>: " . $e->getMessage();
    if ($e->getCode() == 401) {
        // Remove auth file
        unlink($config["app"]["authfile"]);
        // Re auth
        echo '<p><a href="authorize.php">Click Here to re-authenticate</a></p>';
    }
}

?>
Другие вопросы по тегам