【问题标题】:Unable to upload files on Google Cloud Storage using PHP via Google Compute Engine无法通过 Google Compute Engine 使用 PHP 在 Google Cloud Storage 上上传文件
【发布时间】:2021-06-19 13:03:49
【问题描述】:

我正在尝试将图像文件上传到 GCS 中的存储桶,仅在我的页面上插入了一个文件输入和一个按钮以进行一些测试,当我单击该按钮时,它什么也没做,没有错误,什么也没有。我在 Google Cloud Platform Compute Engine 中使用 Ubuntu VM。 实际上我不能用谷歌云存储客户端做任何事情,不能上传对象,列出对象,列出存储桶,我已经把它上传到我的网站但它不起作用,首先在 localhost 上尝试但它给了我这个错误: cURL 错误 60: SSL 证书问题:无法获取本地颁发者证书,这就是我将其上传到 GCP 上的 VM 的原因。

<?php
require_once __DIR__.'/vendor/autoload.php';
use Google\Cloud\Storage\StorageClient;
class googleStorage{
    private $projectId;
    private $storage;
    public function __construct() {
        //putenv("GOOGLE_APPLICATION_CREDENTIALS=/var/www/html/vendor/google/Cloud/credentials.json");        
        $this->projectId = 'my_project_id';
        $this->storage = new StorageClient([
            'projectId' => $this->projectId
        ]);
        $this->storage->registerStreamWrapper();
    }

    function uploadObject($bucketName, $objectName, $source) {
        $file = fopen($source, 'r');
        $bucket = $this->storage->bucket($bucketName);
        $object = $bucket->upload($file, [
            'name' => $objectName
        ]);
        printf('Uploaded %s to gs://%s/%s' . PHP_EOL, basename($source), $bucketName, $objectName);
    }

    public function listBuckets() {
        $buckets = $this->storage->buckets();
        foreach ($buckets as $bucket) {
            echo $bucket->name() . PHP_EOL;
        }
    }

    function listObjects($bucketName) {
        $bucket = $this->storage->bucket($bucketName);
        foreach ($bucket->objects() as $object) {
            printf('Object: %s' . '<br>', $object->name());
        }
    }

    function getImageUrl($bucketName, $objectName) {
        return 'https://storage.cloud.google.com/'.$bucketName.'/'.$objectName;
    }

}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap Select-->
    <link rel="stylesheet" href="vendor/bootstrap-select/css/bootstrap-select.min.css">
    <title>Document</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="foto" class="form-control">
    <button type="submit" name="upload" class="form-control">Upload</button>
</form>
<?php
    include "googleStorage.php";
    $bucket = "my_bucket";
    $storage = new googleStorage();
    $storage->listBuckets();
    $storage->listObjects($bucket);
    $imageUrl = $storage->getImageUrl($bucket, 'stitch.jpg');


    if(isset($_POST['upload'])){
        $storage->uploadObject($bucket, $_FILES['foto']['name'], $_FILES['foto']['tmp_name']);
    }    
?>   
</body>
</html>

【问题讨论】:

  • 该错误并非源自 Cloud Storage 或 Google Cloud。检查此question 有 9 个答案您应该尝试。
  • 这能回答你的问题吗? cURL error 60: SSL certificate in Laravel 5.4
  • 我知道 localhost 上的问题并非源自 Google Cloud,但是,我将文件上传到 Google Compute Engine 上的 VM 并且无法上传文件,所以我的问题是我无法使用 PHP 将图片上传到 Google Cloud Storage,cURL 错误仅发生在本地主机上,但我想从我的网站上传文件,感谢您的回答 @JohnMichaelGelilio,但它不能解决我的问题
  • 不,@SoniSol 它没有回答我的问题
  • @Erik 转到您的Compute Engine,单击您的 vm 实例,然后检查您的 Cloud API 访问范围。如果将其设置为默认值,请尝试将其设置为允许完全访问所有云 API,您的 vm 实例将有权访问所有云 API,包括云存储。注意,您不能编辑 Cloud API 访问范围,您必须先停止 vm。

标签: php google-cloud-storage google-compute-engine


【解决方案1】:

要让 Compute Engine vm 实例能够访问 Cloud Storage,请按照以下步骤操作:

  1. 转到Compute Engine
  2. 点击您的虚拟机实例
  3. 检查最底部的Cloud API 访问范围

注意:如果设置为允许默认访问,则必须通过以下步骤进行更改:

  1. 停止您的虚拟机并点击编辑

  2. 转到云 API 访问范围

  3. 选择以下选项:

    A. 允许完全访问所有 Cloud API,以访问所有 Cloud API,包括 Cloud Storage。

    B. 为每个 API 设置访问权限,只有选定的 Cloud API 才有访问权限。

  4. 保存启动/恢复您的虚拟机。

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2020-04-04
    • 2014-11-22
    • 2015-08-28
    • 1970-01-01
    • 2015-11-16
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多