我正在尝试使用PHP将一些文件上传到Google云端存储。它似乎部分工作,因为我在Web控制台中看到文件,但是我注意到所有文件的大小只有14个字节,而原始文件要大得多。
这是我正在使用的代码:
/**
*
*/
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 :(得分:2)
您似乎只是将文件路径作为字符串上传到文件中,而不是实际文件。
如果您查看客户端库,they seem to use fopen
$bucket->upload( fopen($originalFile->getRealPath(), 'rb'), ['name' => $newFilename]);
答案 1 :(得分:0)
是的,对于使用文件上传,您需要读取字节流以将其发送到远程云。 fopen将为你完成这项工作,创建字节流。
答案 2 :(得分: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
}
}
您的代码无效的原因是您只将文件名上传到Google Cloud。 “/ tmp / asdfasd”是14个字符。
Here是为什么'b'对fopen命令很重要的答案。
FClose关闭资源,防止数据泄露。另外,检查fclose()的返回值,因为某些操作系统只刷新文件输出。检查返回值可以节省严重的数据泄漏。