如何在PHP中从Google Drive获取文件URL?

问题描述 投票:0回答:1

我尝试使用 Google Drive API Quickstart.php 并更改了其中的一部分以列出文件 URL。然而它没有用。有人可以帮助我吗?

这是我的代码,代码的最后一部分是打印文件的名称、id 和 URL。

<?php
/**
 * Copyright 2018 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
// [START drive_quickstart]
require_once __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

use Google\Client;
use Google\Service\Drive;

/**
 * Returns an authorized API client.
 * @return Client the authorized client object
 */
function getClient()
{
    $client = new Google\Client();
    $client->setApplicationName('Google Drive API PHP Quickstart');
    $client->setScopes(Google_Service_Drive::DRIVE,"https://www.googleapis.com/auth/drive.readonly");
    $client->setAuthConfig('credentials.json');
    $client->setRedirectUri('http://127.0.0.1/home/ubuntu/intern/quickstart.php');
    $client->setAccessType('offline');
    $client->setPrompt('consent');
    $client->setIncludeGrantedScopes(true);

    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    try{


        if ($client->isAccessTokenExpired()) {
            // Refresh the token if possible, else fetch a new one.
            if ($client->getRefreshToken()) {
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
            } else {
                // Request authorization from the user.
                $authUrl = $client->createAuthUrl();
                printf("Open the following link in your browser:\n%s\n", $authUrl);
                print 'Enter verification code: ';
                $authCode = trim(fgets(STDIN));

                // Exchange authorization code for an access token.
                $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
                $client->setAccessToken($accessToken);

                // Check to see if there was an error.
                if (array_key_exists('error', $accessToken)) {
                    throw new Exception(join(', ', $accessToken));
                }
            }
            // Save the token to a file.
            if (!file_exists(dirname($tokenPath))) {
                mkdir(dirname($tokenPath), 0700, true);
            }
            file_put_contents($tokenPath, json_encode($client->getAccessToken()));
        }
    }
    catch(Exception $e) {
        // TODO(developer) - handle error appropriately
        echo 'Some error occured: '.$e->getMessage();
    }
    return $client;
}


// Get the API client and construct the drive object.
$client = getClient();
$drive = new Google\Service\Drive($client);

// Print the names and IDs for up to 10 files.
$optParams = array(
    'pageSize' => 10,
    'fields' => 'nextPageToken, files(id, name, webContentLink)'
);
$results = $drive->files->listFiles($optParams);

if (count($results->getFiles()) == 0) {
    print "No files found.\n";
} else {
    print "Files:\n";
    foreach ($results->getFiles() as $file) {
        printf("%s (%s)", $file->getName(), $file->getId());
        $webContentLink = $file->getWebContentLink();
        if (!empty($webContentLink)) {
            printf("Web Content Link: %s\n", $webContentLink);
        }
        else{
            echo"can't generate URL \n";
        }
    }
}
// [END drive_quickstart]

我希望我的终端中会存在该 URL,但事实并非如此。

php google-api-php-client
1个回答
0
投票

修改要点:

  • 在当前阶段,仅当 mimeType 不是 Google Docs 文件(文档、电子表格、幻灯片等)和文件夹时,才会返回
    webContentLink
    的值。我猜从你显示的文件ID的长度来看,
    can't generate URL
    的原因可能就是这个原因。
  • 如果你想显示查看链接,用
    webViewLink
    代替
    webContentLink
    怎么样?
  • 或者,如果你想使用
    webContentLink
    ,检查文件的mimeType怎么样?

当这些点都体现在你的脚本中时,下面的修改如何?

模式1:

在此模式中,使用

webViewLink
代替
webContentLink

$client = getClient();
$drive = new Google\Service\Drive($client);

// Print the names and IDs for up to 10 files.
$optParams = array(
    'pageSize' => 10,
    'fields' => 'nextPageToken, files(id, name, webViewLink)'
);
$results = $drive->files->listFiles($optParams);

if (count($results->getFiles()) == 0) {
    print "No files found.\n";
} else {
    print "Files:\n";
    foreach ($results->getFiles() as $file) {
        printf("%s (%s)", $file->getName(), $file->getId());
        $webViewLink = $file->getWebViewLink();
        printf("Web View Link: %s\n", $webViewLink);
    }
}

模式2:

在此模式中,通过检查 mimeType 来使用

webContentLink
。如果 mimeType 是 Google Docs 文件,则使用
webViewLink

$client = getClient();
$drive = new Google\Service\Drive($client);

// Print the names and IDs for up to 10 files.
$optParams = array(
    'pageSize' => 10,
    'fields' => 'nextPageToken, files(id, name, webContentLink, mimeType, webViewLink)'
);
$results = $drive->files->listFiles($optParams);

if (count($results->getFiles()) == 0) {
    print "No files found.\n";
} else {
    print "Files:\n";
    foreach ($results->getFiles() as $file) {
        printf("%s (%s)", $file->getName(), $file->getId());
        if (false === strpos($file->getMimeType(), 'application/vnd.google-apps')) {
            $webContentLink = $file->getWebContentLink();
            printf("Web Content Link: %s\n", $webContentLink);
        } else {
            $webViewLink = $file->getWebViewLink();
            printf("Web View Link: %s\n", $webViewLink);
        }
    }
}

注:

  • 在上述脚本中,如果您想使用共享链接,请将此脚本修改如下。

    • 来自

      printf("Web View Link: %s\n", $webViewLink);
      
    • printf("Web View Link: %s\n", str_replace('drivesdk', 'sharing', $webViewLink));
      
  • 如果要获取导出文件的URL,当mimeType为Google Docs文件时,使用

    exportLinks
    怎么样?

参考:

© www.soinside.com 2019 - 2024. All rights reserved.