你能告诉我PHP中的这个谷歌驱动API调用函数有啥问题吗

Posted

技术标签:

【中文标题】你能告诉我PHP中的这个谷歌驱动API调用函数有啥问题吗【英文标题】:can you tell me what's wrong with this google drive API call function in PHP你能告诉我PHP中的这个谷歌驱动API调用函数有什么问题吗 【发布时间】:2018-02-14 22:14:45 【问题描述】:

我有这段代码可以运行并从我的驱动器中获取图像。但是每次运行这段代码都会遇到问题。

  function listF() 

    $result = array();
    $tok = array();
    $nextPageToken = NULL;
  do 
    try 
      $parameters = array();
      if ($nextPageToken) 
        $parameters['pageToken'] = $nextPageToken;
        $parameters['q'] = "mimeType='image/jpeg' or mimeType='image/png'";
      
      $files = $this->service->files->listFiles($parameters);
      $tok[] = $nextPageToken;
      $result = array_merge($tok, $result, $files->getFiles());
      $nextPageToken = $files->getNextPageToken();
     catch (Exception $e) 
      print "An error occurred: " . $e->getMessage();
      $nextPageToken = NULL;
    
   while ($nextPageToken);
  return $result;

我收到此错误:

An error occurred: 
 "error": 
  "errors": [
   
    "domain": "global",
    "reason": "invalid",
    "message": "Invalid Value",
    "locationType": "parameter",
    "location": "pageToken"
   
  ],
  "code": 400,
  "message": "Invalid Value"
 

这对我来说似乎并不违法。也许你能找到错误。谢谢

【问题讨论】:

"location": "pageToken" - 听起来 pageToken 是具有无效值的参数。你检查过对应的变量包含什么……? 在您的代码中,您定义了$nextPageToken = NULL;。因此,您的条件 if ($nextPageToken) 从未奏效。您收到的错误也是如此,即提供的 pageToken 值无效。 @Chinmayjain 它是故意为空的,因此它不会进入 if 语句,因为在 "$nextPageToken = $files->getNextPageToken();" 之前不会有任何 nextPageToken弹出。 尝试在调用 listFiles 之前显示 $nextPageToken 的值。我怀疑你的if ($nextPageToken) 是真的,而它应该是假的。 `$parameters['q']` 也不应该在你的 if 块内 【参考方案1】:

我将使用 javascript 回答您的nextPageToken 问题,请注意逻辑。 我有两个相同的 listFile() 函数。一个在初始加载时执行,加载页面后,它显示我的 100 个文件中的前 10 个。另一个在每次单击按钮时执行。

第一个函数显示最初的 10 个文件。

//take note of this variable
  var nextToken ;
  function listFiles() 
    gapi.client.drive.files.list(
      'pageSize': 10,
      'fields': "*"
    ).then(function(response) 

          //assign the nextPageToken to a variable to be used later
          nextToken = response.result.nextPageToken;
          // do whatever you like here, like display first 10 files in web page
          // . . .
        );
      

第二个功能: 这个功能是通过点击一个名为“下一页”的按钮触发的,该按钮显示从11到N的后续文件。

 function gotoNextPage(event) 
          gapi.client.drive.files.list(
            'pageSize': 10,
            'fields': "*",
            'pageToken': nextToken
          ).then(function(response) 
            //assign new nextPageToken to make sure new files are displayed
            nextToken = response.result.nextPageToken;
            //display batch of file results in the web page
            //. . .          
          );
  

【讨论】:

嘿,我在第二次搜索时遇到错误。令牌问题。得到它,但 api 告诉它错了。 设法解决了这个问题:***.com/questions/47402545/…google sux (【参考方案2】:

看来 nextPageToken 将被判定为无效,除非您在后续请求中包含与初始请求中包含的完全相同的查询字段 (q)。

var files = []
var nextToken;
gapi.client.drive.files.list(
    'q': "mimeType='image/jpeg' or mimeType='image/png'",   
    'pageSize': 10,
    'fields': 'nextPageToken, files(id, name)'
).then(function(response) 
    nextToken = response.result.nextPageToken;
    files.push(...response.result.files)
    while (nextToken) 
        gapi.client.drive.files.list(
            'nextPage': nextToken,
            'q': "mimeType='image/jpeg' or mimeType='image/png'",   
            'pageSize': 10,
            'fields': 'nextPageToken, files(id, name)'
        ).then(function(response) 
            nextToken = response.result.nextPageToken;
            files.push(...response.result.files)
        )
    
);

【讨论】:

【参考方案3】:

Google Drive V3 php API 的文档不如 V2 丰富。

我没有找到将pageToken 用于 V3 API 的简单 PHP 示例,所以我提供了这个:

 $parameters = array();
 $parameters['q'] = "mimeType='image/jpeg' or mimeType='image/png'";
 $parameters['fields'] = "files(id,name), nextPageToken";
 $parameters['pageSize'] = 100;
 $files = $google_drive_service->files->listFiles($parameters);

 /* initially, we're not passing a pageToken, but we need a placeholder value */
 $pageToken = 'go';

 while ($pageToken != null) 
     if (count($files->getFiles()) == 0) 
        echo "No files found.\n";
      
     else 
             foreach ($files->getFiles() as $file) 
                echo "name: '".$file->getName()."' ID: '".$file->getId()."'\n";
             
     

    /* important step number one - get the next page token (if any) */
    $pageToken = $files->getNextPageToken(); 

    /* important step number two - append the next page token to your query */
    $parameters['pageToken'] = $pageToken;
 
    $files = $google_drive_service->files->listFiles($parameters);

【讨论】:

【参考方案4】:

经过 V3 测试的解决方案。这将通过处理分页来处理大集合(大于 1000):

function GetFiles()


    $options =
    [
        'pageSize' => 1000,
        'supportsAllDrives' => true,
        'fields' => "files(id, mimeType, name), nextPageToken"
    ];

    $files = [];
    $pageToken = null;

    do
    
        try
        
            if ($pageToken !== null)
            
                $options['pageToken'] = $pageToken;
            

            $response = $this->service->files->listFiles($options);

            $files = array_merge($files, $response->files);
            $pageToken = $response->getNextPageToken();
        
        catch (Exception $exception)
        
            $message = $exception->getMessage();
            echo "Error: $message\r\n";
            $pageToken = null;
        
     while ($pageToken !== null);

    return $files;

【讨论】:

以上是关于你能告诉我PHP中的这个谷歌驱动API调用函数有啥问题吗的主要内容,如果未能解决你的问题,请参考以下文章

delphi,有啥API或者函数能够提升权限至ring0或者system之类的

为什么我从谷歌驱动器休息api禁止服务器回复?

api函数是啥意思,有啥分类?

PHP中函数的参数和参数有啥不同? [复制]

PHP 中的“->”有啥作用? [复制]

你能告诉 php 服务器中止以前运行的脚本的执行吗?