我尝试使用 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,但事实并非如此。
webContentLink
的值。我猜从你显示的文件ID的长度来看,can't generate URL
的原因可能就是这个原因。webViewLink
代替webContentLink
怎么样?webContentLink
,检查文件的mimeType怎么样?当这些点都体现在你的脚本中时,下面的修改如何?
在此模式中,使用
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);
}
}
在此模式中,通过检查 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
怎么样?