php 通过浏览器上传到Google云端硬盘

9wbgstp7  于 2023-01-08  发布在  PHP
关注(0)|答案(1)|浏览(172)

我有这个问题与上传文件到谷歌驱动器使用服务/测试用户,但事情是,我想跳过oauth完全。我想有一个上传表单准备用户(例如教师)上传他们的文件到驱动器,而不需要登录/登录/验证身份/等...我需要这样做的javascript只。
我试着用.json运行,但我不认为我可以让它在浏览器上运行,因为我使用的是app.listen(),端口是给定的,它运行在cmd上,使用的是“node index.js(例如)”命令。所以我需要一个java脚本或php替代/代码片段。

lsmepo6l

lsmepo6l1#

要写入google drive账户,你需要该账户所有者的许可,因为它包含私人用户数据。
对于客户端JavaScript,唯一的选择是隐式流,它要求用户在每次登录应用程序时授权请求。

要考虑的服务器端备选方案。

如果你想考虑一个服务器端的选择。我有几个选择给你。
首先,如果你上传到google drive上的一个文件夹,你可以使用一个服务账户,这个服务账户就像一个虚拟用户,你可以和服务账户共享这个文件夹,这样服务账户就可以访问这个文件夹,然后在你的服务器端代码中,服务账户可以在需要的时候访问它,而不需要用户的授权。
第二,如果你上传到你的用户的驱动器帐户。你可以使用Oauth2并请求用户授权一次。在那时你存储返回给你的刷新令牌,然后当用户再次回来时,你可以使用刷新令牌请求一个新的访问令牌并上传到他们的谷歌驱动器帐户。这种解决方案只需要用户授权你的应用程序一次。
上述两种解决方案都可以使用node.js或php,只需要在服务器端即可。

驱动器服务帐户php

下面是一个基本的服务帐户授权示例,记住一旦你创建了服务帐户,就将服务帐户的电子邮件地址与你的google drive帐户上你想上传到的文件夹共享。
How to create Google Oauth2 Service account credentials.

<?php
require __DIR__ . '/vendor/autoload.php';

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

use Google\Service\Drive;

const CREDENTIALS = 'C:\Development\FreeLance\GoogleSamples\Credentials\ServiceAccountCred.json';
const SCOPES = [Google_Service_Drive::DRIVE_METADATA_READONLY];

printf("Service Account Access to google drive api.\n");

// Create service account client, with drive scopes.
$client = new Google\Client();
$client->setAuthConfig(CREDENTIALS);
$client->setScopes(SCOPES);

// Create Google Drive service
$service = new Drive($client);

// Print files that the service account has access to.
try {

    $optParams = array(
        'pageSize' => 10,
        'fields' => 'files(id,name,mimeType)',
        'q' => 'mimeType = "application/vnd.google-apps.folder" and "root" in parents',
        'orderBy' => 'name'
    );
    $results = $service->files->listFiles($optParams);
    $files = $results->getFiles();

    if (empty($files)) {

        $data = json_decode(file_get_contents(CREDENTIALS), true);

        print "No files found.\n";
        printf("Please upload a file or share a file with the service account at (%s) ", $data["client_email"]);
    } else {
        print "Files:\n";
        foreach ($files as $file) {
            $id = $file->id;

            printf("%s - (%s) - (%s)\n", $file->getId(), $file->getName(), $file->getMimeType());
        }
    }
} catch (Exception $e) {
    // TODO(developer) - handle error appropriately
    echo 'Message: ' . $e->getMessage();
}

相关问题