我无法从 App Engine 将任何文件上传到 GCS 中的存储桶,但我可以使用 php 从本地服务器编码

问题描述

我一直在尝试将我的应用程序(在应用引擎中运行)创建为 pdf 的一些发票上传到 GCS 中的存储桶。稍后,该应用程序将通过电子邮件向每位客户发送相同的信息。 从我的本地 PC 在 PHP 中运行应用程序时,它运行良好,连接到 App Engine 实例。但是每当我部署完整代码时,它根本不起作用。 我在应用程序的文件夹结构中的文件夹中有服务帐户的凭据文件(这是由认为我的项目创建的原始文件)。无论我是在本地工作还是在 GAE 中工作,只要我尝试访问 GCS 中的存储桶,我都会指出它。正如我所说的,本地一切都很顺利,但没有来自云。这是一些代码

//FILE TO UPLOAD TO GCS

date_default_timezone_set('Europe/Madrid');

require __DIR__ . '/../vendor/autoload.PHP';

require_once __DIR__ . '/../cn.PHP';

require_once __DIR__ . '/../librerias/fpdf/fpdf.PHP';

if(!isset($_SESSION)){

        session_start();
 }

use Google\Cloud\Storage\StorageClient;

putenv('GOOGLE_APPLICATION_CREDENTIALS=../librerias/credentials/credentials.json');


function upload_object($bucketName,$objectName,$source){

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

//############### CODE GENErating PDF FILE #######################3

//blablablablablablabla

// ################ END OF PDF FILE GENERATION USING FPDF##################

$pdfData=$pdf->Output('S','',1);
$filename="Facturas/".$ano."/".$factura_1."-".$ano.".pdf";
$bucketName="my-bucket.appspot.com";

upload_object($bucketName,$filename,$pdfData);//THIS IS NOT WORKING WHEM RUNNING FROM GAE,BUT WORKING WELL FROM LOCAL CONNECTING TO MY INSTANCE THROUGH PROXY

//############### CODE SENDING PDF FILE USING SENGRID #######################3

//blablablablablablabla

// ################ END OF PDF FILE SENDING ##################

//END OF FILE UPLOAD TO GCS
//app.yaml

runtime: PHP72

runtime_config:
  document_root: .

handlers:
# Serve a directory as a static resource.
- url: /Css
  static_dir: Css
# Serve a directory as a static resource.
- url: /font
  static_dir: font
# Serve a directory as a static resource.
- url: /librerias
  static_dir: librerias
- url: /librerias/credentials
  static_dir: librerias/credentials


# Serve images as static resources.
- url: /icons/(.+\.(gif|png|jpg|jpeg|ico))$
  static_files: icons/\1
  upload: icons/.+\.(gif|png|jpg|jpeg|ico)$
- url: /img/(.+\.(gif|png|jpg|jpeg))$
  static_files: img/\1
  upload: img/.+\.(gif|png|jpg|jpeg)$
- url: /img/logos/(.+\.(gif|png|jpg|jpeg))$
  static_files: img/logos/\1
  upload: img/logos/.+\.(gif|png|jpg|jpeg)$

- url: .*
  script: auto
  secure: always

entrypoint:
  serve handler.PHP

解决方法

解决了,我终于让它工作了。问题似乎是如何授权我的服务帐户。而不是

putenv('GOOGLE_APPLICATION_CREDENTIALS=../librerias/credentials/credentials.json');

它正在与

$storage = new StorageClient([
    'keyFile' => json_decode(file_get_contents('mycredentials.json'),true)
]);