使用 python 脚本使用驱动器 api 将非常大的文件上传到谷歌驱动器

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

我希望使用 drive api v3 从我的远程服务器上传一个非常大的 zip 文件(几百 GB)到我的谷歌驱动器。我尝试按照 Toward Data Science 中的 教程进行操作,但它将可恢复上传的使用推迟到驱动器 api 文档,这对初学者来说不是很友好。关于此事的其他问题不处理我正在处理的文件大小。他们也没有提到在上传文件时保持访问令牌有效的问题。我在搜索过程中还发现了another SO answer。然而,它又是一种“多部分”上传方式。

任何帮助将不胜感激。我希望使用 python 脚本自动执行此操作。

提前致谢!

python google-cloud-platform google-drive-api resumable
1个回答
0
投票

这是 PHP 示例,但也许对您有帮助 在 php 中像这样上传

public function uploadFileChunk($uploadFile)
{
    try {
        if ($uploadFile) {
            $client = $this->getClient();
            $service = new Google_Service_Drive($client);
            $uploadFileExp = explode('\\', $uploadFile);
            $uploadFileName = end($uploadFileExp);
            $file = new Google_Service_Drive_DriveFile();
            $file->setName($uploadFileName);
            $chunkSizeBytes = 100 * 1024 * 1024;
            $client->setDefer(true);
            $request = $service->files->create($file);
            $media = new Google_Http_MediaFileUpload(
                $client,
                $request,
                'application/octet-stream',
                null,
                true,
                $chunkSizeBytes
            );
            $status = false;
            $handle = fopen($uploadFile, "rb");
            $fileSize = filesize($uploadFile);
            $total_records = (int)($fileSize/$chunkSizeBytes);
            $media->setFileSize($fileSize);
            $i = 0;
            while (!$status && !feof($handle)) {
                ++$i;
                $chunk = fread($handle, $chunkSizeBytes);
                $status = $media->nextChunk($chunk);
            }

            $result = false;
            if ($status != false) {
                $result = $status;
            }

            fclose($handle);
            $client->setDefer(false);
            $fileId = $result->id;
            return $fileId;


        }
    } catch (Exception $e) {
        throw $e;
    }
}

你需要刷新你的访问令牌来上传大文件,比如 50GB+

if ($client->isAccessTokenExpired()) {

    $client->fetchAccessTokenWithRefreshToken($refreshToken['refresh_token']);

    file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
© www.soinside.com 2019 - 2024. All rights reserved.