2017-03-26 164 views
1

我正嘗試使用PHP將一些文件上傳到Google雲端存儲。這似乎是部分工作,因爲我看到的Web控制檯中的文件,但我注意到,所有文件只有14個字節的大小,而原來更大。只有14個字節被上傳到Google雲端存儲

這是我使用的代碼:

/** 
* 
*/ 
public static function saveFile($originalFile, $newFilename) { 

    $bucket = MyStorage::getBucket(); 

    if ($bucket == null) { 

     // Save locally 
     Storage::disk('local')->put(FileController::$FILE_DIR . $newFilename, file_get_contents($originalFile)); 

    } else { 

     // Save to Google Cloud Platform 
     $bucket->upload($originalFile->getRealPath(), ['name' => $newFilename]); 

    } 
} 

/** 
* 
*/ 
private static function getBucket() { 

    $appEnv = getenv('APP_ENV'); 

    if ($appEnv == "production" || $appEnv == "test") { 

     $GOOGLE_CLOUD_PROJECT_ID = getenv('GOOGLE_PROJECT_ID'); 
     $GOOGLE_CLOUD_BUCKET_NAME = getenv('GOOGLE_BUCKET_NAME'); 

     $storage = new StorageClient(['projectId' => $GOOGLE_CLOUD_PROJECT_ID]); 
     $bucket = $storage->bucket($GOOGLE_CLOUD_BUCKET_NAME); 

     return $bucket; 

    } else { 

     return null; 
    } 
} 

$originalFile->getRealPath()回報像/tmp/asdfasdfadf和我驗證過該文件存在,是一個合理的規模。 $newFilename變量名是我希望它被存儲爲,這部分似乎工作,因爲我在Web控制檯中看到該文件名。

任何想法可能發生什麼?

+0

我真的不知道PHP,但有可能是你只上傳文件路徑作爲一個字符串,而不是到實際的文件?如果您查看客戶端庫,他們似乎使用'fopen':https://googlecloudplatform.github.io/google-cloud-php/#/docs/google-cloud/v0.24.0/storage/bucket?method=上傳 即'$ bucket-> upload(fopen($ originalFile-> getRealPath(),'r'),['name'=> $ newFilename]);' –

+0

您可以在php中更改最大允許大小的上傳。 ini.serch這個upload_max_filesize = 128M – lalithkumar

+0

@RobertLacok好,我會檢查出來並報告回來。 – Sandy

回答

1

看來你只是上傳到文件的路徑作爲字符串,而不是實際的文件。

如果你看一下客戶端庫,they seem to use fopen

$bucket->upload(fopen($originalFile->getRealPath(), 'rb'), ['name' => $newFilename]);

+0

謝謝,這解決了我的錯誤。 – zundi

0

是的,對於使用文件上傳,您需要讀取字節流以將其發送到遠程雲。 fopen會爲你做這個工作,來創建字節流。

0
else { 

    // Save to Google Cloud Platform 
    $bucket->upload($originalFile->getRealPath(), ['name' => $newFilename]); 

} 

應該是:

else { 

    // Save to Google Cloud Platform 
    $bucket->upload(fopen($originalFile->getRealPath(), 'rb'), ['name' => $newFilename]); 

    if(fclose($originalFile->getRealPath()) === false){ 
     // Success 
    } else{ 
     // Failure 
    } 


} 

你的代碼沒有工作,是因爲你只上傳的文件名以谷歌雲計算的原因。 「/ tmp/asdfasd」是14個字符。

Here是爲什麼'b'對fopen命令很重要的答案。

FClose關閉資源,防止數據泄漏。另外,請檢查fclose()的返回值,因爲某些操作系統只會刷新文件輸出。檢查返回值可以節省嚴重的數據泄漏。

相關問題