我的应用程序支持从Excel文档导入数据。我想通过复制粘贴链接(而不是保存并从下载文件夹中选择)添加对从Google云端硬盘电子表格导入数据的支持。
此代码适用于公开可用的文件(通过共享链接):
$url = 'https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=...&exportFormat=xlsx';
file_put_contents('path/to/file.xlsx', file_get_contents($url));
然后我将保存文件路径传递给导入器,它可以正常工作。
对于私人文件,此代码没有意义,因为我们获取了权限错误并且检索了HTML而不是Excel数据。
我安装了最新版本的google/google-api-php-client,按照Using OAuth 2.0 for Web Server Applications文章中描述的步骤进行操作。
我的oauth2callback.php
文件内容:
<?php
require_once '../../vendor/autoload.php';
session_start();
$client = new Google_Client;
$client->setAuthConfigFile('/path/to/google_auth_config.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setAccessType('offline');
if (!isset($_GET['code'])) {
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
} else {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirectUri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
header('Location: ' . filter_var($redirectUri, FILTER_SANITIZE_URL));
}
主要代码如下:
$client = new Google_Client;
$client->setAuthConfig('/path/to/google_auth_config.json');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$driveService = new Google_Service_Drive($client);
$fileId = '...';
// For testing purposes
$file = $driveService->files->get($fileId);
$content = $driveService->files->get($fileId, ['alt' => 'media']);
$content = $driveService->files->export(
$fileId,
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
['alt' => 'media']
);
} else {
$redirectUri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
header('Location: ' . filter_var($redirectUri, FILTER_SANITIZE_URL));
}
此:
$file = $driveService->files->get($fileId);
工作正常,我得到有效的Google_Service_Drive_DriveFile
实例。
下载示例来自Download Files文档。
此:
$content = $driveService->files->get($fileId, ['alt' => 'media']);
抛出异常:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "badRequest",
"message": "The specified file does not support the requested alternate representation.",
"locationType": "parameter",
"location": "alt"
}
],
"code": 400,
"message": "The specified file does not support the requested alternate representation."
}
}
此:
$content = $driveService->files->export(
$fileId,
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
['alt' => 'media']
);
给出错误:
调用未定义的方法Google_Service_Drive_Files_Resource :: export()
用户拥有此共享文件夹的编辑权限,downloadUrl
中的exportLinks
和null
属性为$file
,但我可以获得title
等属性。< / p>
有什么想法吗?
我在Google_Http_Request
看到了其他一些例子,但是这已被Guzzle取代,所以它现在没用了。
答案 0 :(得分:2)
指定的文件不支持请求的替代表示。
关于这个问题似乎有another post here。基本上它表明Sheets没有媒体。获取表格文件时,您可以尝试删除alt=media
参数。
调用未定义的方法Google_Service_Drive_Files_Resource :: export()
命名空间中未定义export
方法。检查您是否正在使用您引用的链接上指示的php客户端仓库的v1-branch
。 v1-branch Service.php似乎有导出方法,因此可能有效;是master Drive.php没有一个(导致错误)