致命错误:未捕获的异常' InvalidArgumentException'有消息''代码'必须是非空的'

时间:2017-06-14 13:23:12

标签: php dropbox

我正在尝试使用PHP显示收件箱文件夹和文件。同时我收到以下错误:

  

致命错误:未捕获的异常' InvalidArgumentException'有消息''代码'必须是非空的'在D:\ xampp \ htdocs \ Dropbox \ dropbox \ Dropbox \ Checker.php:59堆栈跟踪:#0 D:\ xampp \ htdocs \ Dropbox \ dropbox \ Dropbox \ WebAuthNoRedirect.php(79):Dropbox \ Checker :: argStringNonEmpty ('代码','')#1 D:\ xampp \ htdocs \ Dropbox \ dropbox.php(24):Dropbox \ WebAuthNoRedirect->完成('& #39;)在第59行的D:\ xampp \ htdocs \ Dropbox \ dropbox \ Dropbox \ Checker.php中抛出#2 {main}

这是我的代码:

<?php
require_once "dropbox/Dropbox/autoload.php";
require_once "dropbox/Dropbox/AppInfo.php";
use \Dropbox as dbx;
$appInfo = dbx\AppInfo::loadFromJsonFile("app-info.json");
$webAuth = new dbx\WebAuthNoRedirect($appInfo, "PHP-Example/1.0");


if(!function_exists("readline")) {
    function readline($prompt = null){
        if($prompt){
            //echo $prompt;
        }
        $fp = fopen("php://stdin","r");
        $line = rtrim(fgets($fp, 1024));
        return $line;
    }
}


$authorizeUrl = $webAuth->start();
$authCode = \trim(\readline("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"));

list($accessToken, $dropboxUserId) = $webAuth->finish($authCode);
print "Access Token: " . $accessToken . "\n"; 
?>

错误来自$ webAuth-&gt; finish()函数。从错误中我检查了checker.php。已经定义了一个函数。那就是

static function argStringNonEmpty($argName, $argValue)
    {
        if (!is_string($argValue)) self::throwError($argName, $argValue, "string");
        if (strlen($argValue) === 0) throw new \InvalidArgumentException("'$argName' must be non-empty");
    }

如果我命令条件错误继续移动到下一个下一个函数。请帮助解决它。

2 个答案:

答案 0 :(得分:1)

看起来你是API v1 Dropbox PHP SDK。您的代码与the "authorize" example类似。该示例是为命令行应用程序构建的,但您尝试将其作为Web应用程序运行,因此无法正常运行。

具体来说,您尝试从标准输入读取(例如示例如何使用\trim(\fgets(STDIN)))。

对于网络应用,您应该参考web-file-browser example

在任何一种情况下,您都需要提供&#34;授权代码&#34;完成the OAuth app authorization flow

另外,注意PHP SDK使用Dropbox API v1, which is deprecated非常重要。您应该转而使用Dropbox API v2

还没有适用于Dropbox API v2的官方PHP SDK,但您可以使用third party library,也可以自己致电the HTTPS endpoints

答案 1 :(得分:0)

我已经更改了我的代码,如下所示:

session_start();
$_SESSION['user_id'] = 1;

require __DIR__.'/Dropbox/autoload.php';

$dropboxKey = 'XXXXXXXXX';
$dropboxSecret = 'XXXXXXXXXX';
$appName = 'XXXXXXX/1.0';

$appInfo=new Dropbox\AppInfo($dropboxKey,$dropboxSecret);

//store CSRF token
$csrfTokenStore = new Dropbox\ArrayEntryStore($_SESSION,'dropbox-auth-csrf-token');

//Define auth details
$webAuth = new Dropbox\WebAuth($appInfo,$appName,'http://localhost/dropboxapi/dropbox_finish.php',$csrfTokenStore);

if(isset($_session['accessToken']))
{
    $client = new Dropbox\Client($_session['accessToken'],$appName,'UTF-8');
    $client->getAccountInfo();
} else {
$authUrl = $webAuth->start();

Header('Location:'.$authUrl);
exit;
}
list($accessToken) = $webAuth->finish($_GET);

$_session['accessToken']=$accessToken;