当前位置: 首页 > 知识库问答 >
问题:

无法通过谷歌计算引擎使用PHP在谷歌云存储上上传文件

马绪
2023-03-14

我试图上传图像文件到我在GCS的桶中,只在我的页面上插入了一个文件输入和一个按钮进行测试,当我点击按钮时,它没有做任何事情,没有错误,什么都没有。我在谷歌云平台计算引擎中使用的是Ubuntu VM。实际上,我无法使用谷歌云存储客户端做任何事情,无法上传对象、列出对象、列出存储桶,我已经将它上传到我的网站,但它不工作,首先在localhost上尝试,但它给了我这个错误:cURL错误60: SSL证书问题:无法获得本地发行者证书,这就是为什么我将它上传到我在GCP的虚拟机。

<?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>

共有1个答案

欧阳正德
2023-03-14

要使计算引擎虚拟机实例能够访问云存储,请执行以下步骤:

  1. 转到计算引擎
  2. 单击您的vm实例
  3. 检查底部的云API访问范围

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

停止 VM,然后单击“编辑”

转到Cloud API访问范围

选择下面的选项:

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

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

保存并启动/恢复 VM。

 类似资料:
  • 我应该做什么才能成功上传图片?任何帮助都将不胜感激。 非常感谢。

  • 追踪下面。 相关的Python片段: 最终触发(从ssl库): 溢出错误:字符串长度超过2147483647字节 我想我缺少一些特殊的配置选项? 这可能与这名1.5岁的年轻人有关,显然他还没有解决问题:https://github.com/googledatalab/datalab/issues/784. 谢谢你的帮助! 完整跟踪: [File”/usr/src/app/gcloud/downlo

  • 我正在看新的谷歌云数据存储,看起来很棒。但有件事我不明白。。。它应该替代谷歌应用引擎数据存储吗?我如何在GAE内部使用它?它们之间有什么区别? 我在Java有一个GAE应用程序,它使用3个实体,每个实体都有数千行,我需要经常做连接...

  • 我想按照官方文档中提供的示例将一个文件上传到Google云存储 然而,我得到了一个错误: 线程“main”com.google.cloud.storage.StorageException中的异常:获取服务帐户的访问令牌时出错:400个错误请求{“错误”:“无效的授予”、“错误描述”:“无效的JWT:令牌必须是短期令牌(60分钟)并且在合理的时间范围内。请检查JWT声明中的iat和exp值。”位于

  • 根据我在互联网上发现的几个来源,不可能仅通过内部IP将谷歌云功能连接到受限计算引擎实例(例如。https://groups.google.com/forum/#!主题/gce讨论/HEn5P9PJzYQ)。真的还是这样吗?我的设置如下所示: 谷歌云充当API(公共) 我现在通过防火墙规则将计算引擎实例限制为仅内部流量(10.128.0.0/9)。我的应用程序引擎仍然可以连接到计算引擎实例,但我的云