只有14个字节上传到Google云端存储中

时间:2017-03-26 05:28:34

标签: php google-cloud-storage google-cloud-platform

我正在尝试使用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控制台中看到了该文件名。

任何想法可能会发生什么?

3 个答案:

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