2017-03-26 165 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()的返回值,因为某些操作系统只会刷新文件输出。检查返回值可以节省严重的数据泄漏。

相关问题