首页 文章

使用PHP API恢复上传到Google Cloud 端存储

提问于
浏览
2

我可以使用Google PHP API CLIENT将小尺寸文件成功上传到Google Cloud 端存储,但无法上传300MB文件 . 返回内存错误 . 这是我的代码 .

$storage = new Google_Service_Storage($client);

    $file_name = "filenameo.zip";

    $obj = new Google_Service_Storage_StorageObject();
    $obj->setName($file_name);

    $resp = $storage->objects->insert(
        "bucketname",
        $obj,
        array('name' => $file_name, 'data' => file_get_contents("300mb-file.zip"), 'uploadType' => 'media')
    );

我试图将UploadType更改为可恢复..但没有运气 . 请帮忙 .

Update: Used the Http as Brandon Yarbrough answer

收到错误(致命错误:未捕获的异常'Google_IO_Exception')

$storage = new Google_Service_Storage($client);

$obj = new Google_Service_Storage_StorageObject();

$obj->setName("filenameo.zip");
$obj->setBucket("bucketname");


$filen = "300mb-file.zip";
$mimetype = mime_content_type($filen);


$chunkSizeBytes = 1 * 1024 * 1024;
$client->setDefer(true);
$status = false;



$filetoupload = array('name' => $file_name, 'data' => $filen, 'uploadType' => 'media');

$request = $storage->objects->insert("bucketname",$obj,$filetoupload);

$media = new Google_Http_MediaFileUpload($client, $request, $mimetype, $chunkSizeBytes);
$handle = fopen($filen, "rb");
while (!$status && !feof($handle)) {
  $chunk = fread($handle, $chunkSizeBytes);
  $status = $media->nextChunk($chunk);
 }

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

fclose($handle);
// Reset to the client to execute requests immediately in the future.
$client->setDefer(false);

2 回答

  • 5

    得到它使用下面的代码 .

    <?php
    
        require_once("google-api/autoload.php");
        //require_once("google-api/src/Google/Client.php");
        //require_once("google-api/src/Google/Service/Storage.php");
        //require_once("google-api/src/Google/Http/MediaFileUpload.php");
        session_start();
        /**
            * Connect to Google Cloud Storage API
        */
        $client = new Google_Client();
        $client->setApplicationName("ApplicationName");
    
        // $stored_access_token - your cached oauth access token 
        if( $stored_access_token ) {
            $client->setAccessToken( $stored_access_token );
        }
    
        $credential = new Google_Auth_AssertionCredentials(
        "email-sdfaskjrsd@developer.gserviceaccount.com",
        array('https://www.googleapis.com/auth/devstorage.read_write'),
        file_get_contents("pathtokey/mykeyhere-7845b2eb92c9.p12")
        );
    
        $client->setAssertionCredentials($credential);
        if($client->getAuth()->isAccessTokenExpired()) {
            $client->getAuth()->refreshTokenWithAssertion($credential);
            // Cache the access token however you choose, getting the access token with $client->getAccessToken()
        }
    
        $storage = new Google_Service_Storage($client);
    
    
    
        if (isset($_GET['code'])) {
            if (strval($_SESSION['state']) !== strval($_GET['state'])) {
                die('The session state did not match.');
            }
    
    
            $client->authenticate($_GET['code']);
            $_SESSION['token'] = $client->getAccessToken();
            header('Location: ' . $redirect);
        }
        if (isset($_SESSION['token'])) {
            $client->setAccessToken($_SESSION['token']);
        }
    
    
    
    
    
        if ($client->getAccessToken()) {
    
    
                $sfilename = "mfile.zip"; //filename here
                $obj = new Google_Service_Storage_StorageObject();
    
                $obj->setName($sfilename);
                $obj->setBucket("myBucketS"); //bucket name here
    
    
                $filen = "pathtofile/uploadthis.zip";
    
                $mimetype = mime_content_type($filen);
    
    
                $chunkSizeBytes = 1 * 1024 * 1024;
                $client->setDefer(true);
                $status = false;
    
                $filetoupload = array('name' => $sfilename, 'uploadType' => 'resumable');
    
                $request = $storage->objects->insert("myBucketS",$obj,$filetoupload);
    
                $media = new Google_Http_MediaFileUpload($client, $request, $mimetype, null, true, $chunkSizeBytes);
                $media->setFileSize(filesize($filen));
                $handle = fopen($filen, "rb");
    
                while (!$status && !feof($handle)) {
                    $chunk = fread($handle, $chunkSizeBytes);
                    $status = $media->nextChunk($chunk);
                }
    
                $result = false;
                if($status != false) {
                    $result = $status;
                }
    
                fclose($handle);
                // Reset to the client to execute requests immediately in the future.
                $client->setDefer(false);
    
            } else {
            // If the user hasn't authorized the app, initiate the OAuth flow
            $state = mt_rand();
            $client->setState($state);
            $_SESSION['state'] = $state;
            $authUrl = $client->createAuthUrl();
        }
        $_SESSION['token'] = $client->getAccessToken();
    
        print_r($status);
    
    
    ?>
    
  • 4

    file_get_contents 字面上将文件内容作为字符串加载到内存中 . 您的应用程序可能没有额外的300 MB内存可供使用 .

    相反,我建议以块的形式读取文件并上传它们 . Google_Http_MediaFileUpload 是一个很有用的工具 . 这里有一个很好的例子:https://developers.google.com/api-client-library/php/guide/media_upload

    重要的部分是这一点:

    $media = new Google_Http_MediaFileUpload($client, $request, ......, $chunkSizeBytes)
    $handle = fopen("path/to/file", "rb");
    while (!$status && !feof($handle)) {
      $chunk = fread($handle, $chunkSizeBytes);
      $status = $media->nextChunk($chunk);
     }
    

相关问题