休息 API 通话:如何连接 Google 驱动器与 laravel 5?
Rest API call : How to connect Google Drive with laravel 5?
目前与 laravel 5 一起使用 AWS,需要将 google 驱动器添加到我的 laravel 项目,如何连接到 google 驱动器以上传和查看文件用户。
我尝试按照示例进行操作,但出现需要登录的错误。如何在上传文件前获取access_token?
$client = new Google_Client();
$client->setClientId('abc.apps.googleusercontent.com');
$client->setClientSecret('abc');
$client->setRedirectUri('abc');
$client->setScopes(array('https://www.googleapis.com/auth/drive.file'));
if (isset($_GET['code']) || (isset($_SESSION['access_token']) && $_SESSION['access_token']))
{
if (isset($_GET['code'])){
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
}
else
$client->setAccessToken($_SESSION['access_token']);
$service = new Google_Service_Drive($client);
$file = new Google_Service_Drive_DriveFile();
$file->setDescription('image');
$file->setMimeType('image/png');
$data = file_get_contents(public_path('images\log.png');
$createdFile = $service->files->create($file, array(
'data' => $data,
'mimeType' => 'image/png',
'uploadType' => 'multipart'
));
return $createdFile;
} else {
$authUrl = $client->createAuthUrl();
header('Location: ' . $authUrl);
exit();
}
也许你可以检查这个SO Post。它指出了如何在 google 驱动器上登录和上传文件。
这是 github 中指定的代码 post。
<?php
/*
* Copyright 2011 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.
*/
include_once __DIR__ . '/../vendor/autoload.php';
include_once "templates/base.php";
echo pageHeader("File Upload - Uploading a large file");
/*************************************************
* Ensure you've downloaded your oauth credentials
************************************************/
if (!$oauth_credentials = getOAuthCredentialsFile()) {
echo missingOAuth2CredentialsWarning();
return;
}
/************************************************
* The redirect URI is to the current page, e.g:
* http://localhost:8080/large-file-upload.php
************************************************/
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$client = new Google_Client();
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
$service = new Google_Service_Drive($client);
// add "?logout" to the URL to remove a token from the session
if (isset($_REQUEST['logout'])) {
unset($_SESSION['upload_token']);
}
/************************************************
* If we have a code back from the OAuth 2.0 flow,
* we need to exchange that with the
* Google_Client::fetchAccessTokenWithAuthCode()
* function. We store the resultant access token
* bundle in the session, and redirect to ourself.
************************************************/
if (isset($_GET['code'])) {
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
$client->setAccessToken($token);
// store in the session also
$_SESSION['upload_token'] = $token;
// redirect back to the example
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
// set the access token as part of the client
if (!empty($_SESSION['upload_token'])) {
$client->setAccessToken($_SESSION['upload_token']);
if ($client->isAccessTokenExpired()) {
unset($_SESSION['upload_token']);
}
} else {
$authUrl = $client->createAuthUrl();
}
/************************************************
* If we're signed in then lets try to upload our
* file.
************************************************/
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $client->getAccessToken()) {
/************************************************
* We'll setup an empty 20MB file to upload.
************************************************/
DEFINE("TESTFILE", 'testfile.txt');
if (!file_exists(TESTFILE)) {
$fh = fopen(TESTFILE, 'w');
fseek($fh, 1024*1024*20);
fwrite($fh, "!", 1);
fclose($fh);
}
$file = new Google_Service_Drive_DriveFile();
$file->name = "Big File";
$chunkSizeBytes = 1 * 1024 * 1024;
// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);
// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
$client,
$request,
'text/plain',
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize(TESTFILE));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen(TESTFILE, "rb");
while (!$status && !feof($handle)) {
// read until you get $chunkSizeBytes from TESTFILE
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
// An example of a read buffered file is when reading from a URL
$chunk = readVideoChunk($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object
// that has been uploaded.
$result = false;
if ($status != false) {
$result = $status;
}
fclose($handle);
}
function readVideoChunk ($handle, $chunkSize)
{
$byteCount = 0;
$giantChunk = "";
while (!feof($handle)) {
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
$chunk = fread($handle, 8192);
$byteCount += strlen($chunk);
$giantChunk .= $chunk;
if ($byteCount >= $chunkSize)
{
return $giantChunk;
}
}
return $giantChunk;
}
?>
<div class="box">
<?php if (isset($authUrl)): ?>
<div class="request">
<a class='login' href='<?= $authUrl ?>'>Connect Me!</a>
</div>
<?php elseif($_SERVER['REQUEST_METHOD'] == 'POST'): ?>
<div class="shortened">
<p>Your call was successful! Check your drive for this file:</p>
<p><a href="https://drive.google.com/open?id=<?= $result->id ?>" target="_blank"><?= $result->name ?></a></p>
<p>Now try <a href="/large-file-download.php">downloading a large file from Drive</a>.
</div>
<?php else: ?>
<form method="POST">
<input type="submit" value="Click here to upload a large (20MB) test file" />
</form>
<?php endif ?>
</div>
<?= pageFooter(__FILE__) ?>
并打开此 So post 以获得更多参考。
您可以检查 this post from github relating to login error and to retrieve the access token this documentation 定义了所需的步骤。
用户尝试在 Google 驱动器中插入文件时遇到需要登录的问题。
这是回复。
You'll need to grant your app access to your user account using an
OAuth2 authorization flow. Once you've done this, the application will
be granted an access token and refresh token, and will be able to
maintain access to your account using these.
其中您将需要这些一般流程:
- When you create your application, you register it using the Google API Console. Google then provides information you'll need later, such as a client ID and a client secret.
- Activate the Drive API in the Google API Console. (If the API isn't listed in the API Console, then skip this step.)
- When your application needs access to user data, it asks Google for a particular scope of access.
- Google displays a consent screen to the user, asking them to authorize your application to request some of their data.
- If the user approves, then Google gives your application a short-lived access token.
- Your application requests user data, attaching the access token to the request.
- If Google determines that your request and the token are valid, it returns the requested data.
- 使用 google 服务帐户以避免登录或访问令牌。
- 将服务帐户 json 文件附加到 google 客户端 API(在服务帐户页面创建密钥)
- 上传文件到google驱动器并获取文件ID
- 使用文件 ID 在浏览器中访问您的文件
示例:
使用两个函数创建和查看文件
public function uploadTogoogleDrive(){
$client = new Google_Client();
$client->setAuthConfig(public_path('service_account.json'));
$client->setScopes(array('https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file'));
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$service = new Google_Service_Drive($client);
$fileMetadata = new Google_Service_Drive_DriveFile(array(
'name' => 'DefaltReport.pdf'));
$content = file_get_contents(public_path('reports\DefaltReport.pdf'));
$file = $service->files->create($fileMetadata, array(
'data' => $content,
'mimeType' => 'application/pdf',
'uploadType' => 'multipart',
'fields' => 'id'));
printf("File ID: %s\n", $file->id); // Your file id
}
public function viewGoogleDriveFile(){
$fileId = $_GET['fileId'];
$client = new Google_Client();
$client->setAuthConfig(public_path('service_account.json'));
$client->setScopes(array('https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file'));
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$service = new Google_Service_Drive($client);
$response = $service->files->get($fileId, array(
'alt' => 'media' ));
header('Content-type:application/pdf');
echo $content = $response->getBody()->getContents();
}
目前与 laravel 5 一起使用 AWS,需要将 google 驱动器添加到我的 laravel 项目,如何连接到 google 驱动器以上传和查看文件用户。
我尝试按照示例进行操作,但出现需要登录的错误。如何在上传文件前获取access_token?
$client = new Google_Client();
$client->setClientId('abc.apps.googleusercontent.com');
$client->setClientSecret('abc');
$client->setRedirectUri('abc');
$client->setScopes(array('https://www.googleapis.com/auth/drive.file'));
if (isset($_GET['code']) || (isset($_SESSION['access_token']) && $_SESSION['access_token']))
{
if (isset($_GET['code'])){
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
}
else
$client->setAccessToken($_SESSION['access_token']);
$service = new Google_Service_Drive($client);
$file = new Google_Service_Drive_DriveFile();
$file->setDescription('image');
$file->setMimeType('image/png');
$data = file_get_contents(public_path('images\log.png');
$createdFile = $service->files->create($file, array(
'data' => $data,
'mimeType' => 'image/png',
'uploadType' => 'multipart'
));
return $createdFile;
} else {
$authUrl = $client->createAuthUrl();
header('Location: ' . $authUrl);
exit();
}
也许你可以检查这个SO Post。它指出了如何在 google 驱动器上登录和上传文件。
这是 github 中指定的代码 post。
<?php
/*
* Copyright 2011 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.
*/
include_once __DIR__ . '/../vendor/autoload.php';
include_once "templates/base.php";
echo pageHeader("File Upload - Uploading a large file");
/*************************************************
* Ensure you've downloaded your oauth credentials
************************************************/
if (!$oauth_credentials = getOAuthCredentialsFile()) {
echo missingOAuth2CredentialsWarning();
return;
}
/************************************************
* The redirect URI is to the current page, e.g:
* http://localhost:8080/large-file-upload.php
************************************************/
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$client = new Google_Client();
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
$service = new Google_Service_Drive($client);
// add "?logout" to the URL to remove a token from the session
if (isset($_REQUEST['logout'])) {
unset($_SESSION['upload_token']);
}
/************************************************
* If we have a code back from the OAuth 2.0 flow,
* we need to exchange that with the
* Google_Client::fetchAccessTokenWithAuthCode()
* function. We store the resultant access token
* bundle in the session, and redirect to ourself.
************************************************/
if (isset($_GET['code'])) {
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
$client->setAccessToken($token);
// store in the session also
$_SESSION['upload_token'] = $token;
// redirect back to the example
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
// set the access token as part of the client
if (!empty($_SESSION['upload_token'])) {
$client->setAccessToken($_SESSION['upload_token']);
if ($client->isAccessTokenExpired()) {
unset($_SESSION['upload_token']);
}
} else {
$authUrl = $client->createAuthUrl();
}
/************************************************
* If we're signed in then lets try to upload our
* file.
************************************************/
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $client->getAccessToken()) {
/************************************************
* We'll setup an empty 20MB file to upload.
************************************************/
DEFINE("TESTFILE", 'testfile.txt');
if (!file_exists(TESTFILE)) {
$fh = fopen(TESTFILE, 'w');
fseek($fh, 1024*1024*20);
fwrite($fh, "!", 1);
fclose($fh);
}
$file = new Google_Service_Drive_DriveFile();
$file->name = "Big File";
$chunkSizeBytes = 1 * 1024 * 1024;
// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);
// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
$client,
$request,
'text/plain',
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize(TESTFILE));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen(TESTFILE, "rb");
while (!$status && !feof($handle)) {
// read until you get $chunkSizeBytes from TESTFILE
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
// An example of a read buffered file is when reading from a URL
$chunk = readVideoChunk($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object
// that has been uploaded.
$result = false;
if ($status != false) {
$result = $status;
}
fclose($handle);
}
function readVideoChunk ($handle, $chunkSize)
{
$byteCount = 0;
$giantChunk = "";
while (!feof($handle)) {
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
$chunk = fread($handle, 8192);
$byteCount += strlen($chunk);
$giantChunk .= $chunk;
if ($byteCount >= $chunkSize)
{
return $giantChunk;
}
}
return $giantChunk;
}
?>
<div class="box">
<?php if (isset($authUrl)): ?>
<div class="request">
<a class='login' href='<?= $authUrl ?>'>Connect Me!</a>
</div>
<?php elseif($_SERVER['REQUEST_METHOD'] == 'POST'): ?>
<div class="shortened">
<p>Your call was successful! Check your drive for this file:</p>
<p><a href="https://drive.google.com/open?id=<?= $result->id ?>" target="_blank"><?= $result->name ?></a></p>
<p>Now try <a href="/large-file-download.php">downloading a large file from Drive</a>.
</div>
<?php else: ?>
<form method="POST">
<input type="submit" value="Click here to upload a large (20MB) test file" />
</form>
<?php endif ?>
</div>
<?= pageFooter(__FILE__) ?>
并打开此 So post 以获得更多参考。
您可以检查 this post from github relating to login error and to retrieve the access token this documentation 定义了所需的步骤。
用户尝试在 Google 驱动器中插入文件时遇到需要登录的问题。
这是回复。
You'll need to grant your app access to your user account using an OAuth2 authorization flow. Once you've done this, the application will be granted an access token and refresh token, and will be able to maintain access to your account using these.
其中您将需要这些一般流程:
- When you create your application, you register it using the Google API Console. Google then provides information you'll need later, such as a client ID and a client secret.
- Activate the Drive API in the Google API Console. (If the API isn't listed in the API Console, then skip this step.)
- When your application needs access to user data, it asks Google for a particular scope of access.
- Google displays a consent screen to the user, asking them to authorize your application to request some of their data.
- If the user approves, then Google gives your application a short-lived access token.
- Your application requests user data, attaching the access token to the request.
- If Google determines that your request and the token are valid, it returns the requested data.
- 使用 google 服务帐户以避免登录或访问令牌。
- 将服务帐户 json 文件附加到 google 客户端 API(在服务帐户页面创建密钥)
- 上传文件到google驱动器并获取文件ID
- 使用文件 ID 在浏览器中访问您的文件
示例: 使用两个函数创建和查看文件
public function uploadTogoogleDrive(){
$client = new Google_Client();
$client->setAuthConfig(public_path('service_account.json'));
$client->setScopes(array('https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file'));
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$service = new Google_Service_Drive($client);
$fileMetadata = new Google_Service_Drive_DriveFile(array(
'name' => 'DefaltReport.pdf'));
$content = file_get_contents(public_path('reports\DefaltReport.pdf'));
$file = $service->files->create($fileMetadata, array(
'data' => $content,
'mimeType' => 'application/pdf',
'uploadType' => 'multipart',
'fields' => 'id'));
printf("File ID: %s\n", $file->id); // Your file id
}
public function viewGoogleDriveFile(){
$fileId = $_GET['fileId'];
$client = new Google_Client();
$client->setAuthConfig(public_path('service_account.json'));
$client->setScopes(array('https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/drive.file'));
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$service = new Google_Service_Drive($client);
$response = $service->files->get($fileId, array(
'alt' => 'media' ));
header('Content-type:application/pdf');
echo $content = $response->getBody()->getContents();
}