【问题标题】:Create Google Cloud Storage Upload URLs for PHP7.2为 PHP7.2 创建 Google Cloud Storage 上传 URL
【发布时间】:2018-11-16 22:08:16
【问题描述】:

我觉得我在这里遗漏了一些东西,但是在标准环境中使用 PHP 5.5 的 Google App Engine 上,我可以非常轻松地创建上传 URL,供我的用户上传文件,而不会在 PHP 中浪费时间,如下所示:

<?php
use google/appengine/api/cloud_storage/CloudStorageTools;

?><form action="<?php echo CloudStorageTools::createUploadUrl('my/upload/handler.php'); ?>" method="post">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>

当然大大简化了(因为那个 URL 只会持续 60 秒)。

但是,这个 API 似乎不适用于运行 PHP 7.2 的应用引擎,我确实需要使用它,而且我似乎找不到用于获取上传 URL 的替代 API;这些真的停产了吗?

还有其他非常有用的功能,例如 getImageURL() 用于获取缩略图等。当然,很多文档仍然指向上述处理用户上传到应用引擎站点的方法!

那么如何在较新的 API 中创建和使用上传 URL?

【问题讨论】:

    标签: google-app-engine google-cloud-platform google-cloud-storage php-7.2


    【解决方案1】:

    是的,您可以使用 PHP 7.2 Google Client Library 创建和使用上传 URL 用于 Cloud Storage。

    你可以直接把handler放到表单的action属性中,不用调用API。

    请注意,在此示例中,您将要上传文件的存储桶的名称作为环境变量放在 app.yaml 文件中:

    runtime: php72
    env_variables:
      GOOGLE_STORAGE_BUCKET: <your_bucket_name>
    

    index.php

    <?php
    
    namespace Google\Cloud\Samples\AppEngine\Storage;
    
    use Google\Auth\Credentials\GCECredentials;
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    $bucketName = getenv('GOOGLE_STORAGE_BUCKET');
    $projectId = getenv('GOOGLE_CLOUD_PROJECT');
    $defaultBucketName = sprintf('%s.appspot.com', $projectId);
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        switch ($_SERVER['REQUEST_URI']){
    
           case '/user/upload':
              upload_file($bucketName);
              exit;
        }
        header('Location: /');
        exit;
    }
    ?>
    
    <html>
      <form action="/user/upload" enctype="multipart/form-data" method="post">
                Files to upload: <br>
               <input type="file" name="uploaded_files" size="40">
               <input type="submit" value="Send">
      </form>
    </html>
    

    处理函数

    function upload_file($bucketName)
    {
        $fileName = $_FILES['uploaded_files']['name'];
        $tempName = $_FILES['uploaded_files']['tmp_name'];
        move_uploaded_file($tempName, "gs://${bucketName}/${fileName}.txt");
        sprintf('Your file "%s" has been uploaded.', $fileName);
    }
    

    composer.json

    {
        "require": {
            "google/cloud-storage": "^1.5"
        },
        "require-dev": {
            "phpunit/phpunit": "^5",
            "google/cloud-tools": "^0.6"
        }
    }
    

    我建议你从 Github 克隆示例并自己尝试。

    【讨论】:

    • 不知何故错过了这个答案的通知;但这对我来说看起来文件正在上传到应用引擎服务,然后移动到谷歌云存储中。 Google 上传 URL 允许用户使用安全生成的 URL 将文件直接上传到存储桶中,并回调服务,然后允许服务在完成后记录文件的详细信息。
    • 澄清一下;上传 URL 1) 生成直接 Google Storage URL 和显示表单,2) 如果文件已上传,则接收回调,即没有文件发送到应用引擎本身。这看起来像 a) 显示表单 b) 接收文件 c) 移动到云存储中,这意味着应用引擎必须接收整个文件。
    • 在这种情况下,我相信在 PHP 7.2 中您可以使用create a signed url in the handler,然后将SignedUrlUploader method 与您创建的签名 URL 一起使用以开始上传文件。
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 2014-04-16
    • 1970-01-01
    • 2015-08-30
    • 2017-02-25
    • 2018-01-03
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多