1

我目前正嘗試將雲存儲文件重命名和/或移動到其他名稱/位置,但我無法使其工作。我使用https://github.com/google/google-api-php-client作爲客戶端,在上傳工作正常:如何重命名或移動Google雲端存儲中的文件(PHP API)

... 
$storageService = new \Google_Service_Storage($client) 
$file = new \Google_Service_Storage_StorageObject() 
$file->setName('test.txt'); 
$storageService->objects->insert(
    $bucketName, 
    $file, 
    array(
     'name'   => $filename, 
     'data'   => file_get_contents($somefile) 
    ) 
); 
... 

所以我試圖用$ storageObject->對象 - > update()方法來更改文件名,但我不能找到這個任何文件。我使用$ storageService-> objects-> get($ bucketName,$ fileName)來獲取我想重命名的特定文件(使用$ file-> setName()),但似乎我只是無法將文件傳遞給對象 - >更新功能。我做錯了嗎?

+0

請檢查鏈接: - https://cloud.google.com/storage/docs/gsutil/commands/mv – 2015-03-25 08:37:48

+1

感謝您的快速答覆。我需要python作爲gsutil工具,但不幸的是它沒有安裝在服務器上。所以用google api php客戶端重命名文件是不可能的?這對我來說似乎有點奇怪,因爲可以使用php客戶端將文件上傳到存儲。 – dominikweber 2015-03-25 08:46:01

+0

您是否在Google App Engine上運行您的應用?如果是這樣,您應該可以使用rename()直接重命名對象:https://cloud.google.com/appengine/docs/php/googlestorage/advanced#php_filesystem_functions_support_on_google_cloud_storage – Mars 2015-03-30 17:04:06

回答

5

好吧,看來我不能直接重命名一個文件(請糾正我,如果我錯了),我只能更新元數據。我設法通過將文件複製到新的文件名/目的地然後刪除舊文件來實現它。我爲此成功使用了$ storageService-> objects-> copy和$ storageService-> objects-> delete。這感覺不對,但至少它是有效的。

+4

這是正確的(複製+刪除)。沒有原子重命名/移動操作。 – jterrace 2015-03-25 17:48:40

+1

@ user2849119:jterrace是正確的,您無法在php客戶端庫上執行重命名/移動操作。但是您可以執行列表,複製,刪除,插入等操作。 這似乎是一個很好的功能請求,它更好,你也可以在PIT上提交功能請求https://code.google.com/p/googleappengine/ – Shobhit 2015-03-25 23:54:45

+0

任何想法如何複製文件夾?我正在定義桶(源和目標相同),然後定義源文件夾,然後定義目標文件夾。然而,我得到一個404沒有找到錯誤 – 2017-03-24 15:28:58

0

,因爲這不是非常好,谷歌文檔,這裏一個基本的例子:

//RENAME FILE ON GOOGLE CLOUD STORAGE (GCS) 

//Get client and auth token (might vary depending on the way you connect to gcs – here with laravel framework facade) 
//DOC: https://cloud.google.com/storage/docs/json_api/v1/json-api-php-samples 
//DOC: https://developers.google.com/api-client-library/php/auth/service-accounts 
//Laravel Client: https://github.com/pulkitjalan/google-apiclient 
//Get google client 
$gc = \Google::getClient(); 
//Get auth token if it is not valid/not there yet 
if($gc->isAccessTokenExpired()) 
    $gc->getAuth()->refreshTokenWithAssertion(); 
//Get google cloud storage service with the client 
$gcStorageO = new \Google_Service_Storage($gc); 

//GET object at old position ($path) 
//DOC: https://cloud.google.com/storage/docs/json_api/v1/objects/get 
$oldObj = $gcStorageO->objects->get($bucket, $path); 

//COPY desired object from old position ($path) to new position ($newpath) 
//DOC: https://cloud.google.com/storage/docs/json_api/v1/objects/copy 
$gcStorageO->objects->copy(
    $bucket, $path, 
    $bucket, $newpath, 
    $oldObj 
); 

//DELETE old object ($path) 
//DOC: https://cloud.google.com/storage/docs/json_api/v1/objects/delete 
$gcStorageO->objects->delete($bucket, $path); 
+0

你能解釋更多爲什麼這應該工作? – 2015-12-14 21:18:29

+0

@SterlingArcher我添加了更好的代碼文檔。這有幫助嗎? – tromtv 2015-12-15 14:51:18

+0

@SterlingArcher這是一個簡單的副本,然後刪除。這是一種模擬重命名的方法。 – Alex 2015-12-29 09:02:28

0

我發現,結合PHP使用gcutils時,您可以在App Engine上執行,幾乎每一個PHP文件命令。複製,刪除,檢查文件是否存在。

if(file_exists("gs://$bucket/{$folder}/$old_temp_file")){ 

     $old_path = "gs://$bucket/{$folder}/$old_temp_file"; 
     $new_permanent_path = "gs://$bucket/{$folder}/$new_permanent_file"; 

     copy($old_path, $new_permanent_path); 

     unlink($old_path); 

    } 
相關問題