Я не могу загрузить какой-либо файл в корзину в GCS из App Engine, но я могу с моего локального сервера, кодирующего с помощью php

#php #google-app-engine #google-cloud-storage #bucket

#php #google-app-engine #google-cloud-storage #корзина

Вопрос:

Я долгое время пытался загрузить некоторые счета-фактуры, которые мое приложение (которое работает в app engine) создает в формате pdf, в корзину в GCS. Позже приложение отправит то же самое по электронной почте каждому клиенту. Он хорошо работает при запуске приложения на php с моего локального компьютера, подключаясь к экземпляру App Engine. Но всякий раз, когда я развертываю полный код, он вообще не работает. У меня есть файл учетных данных для учетной записи службы (которая изначально была создана по умолчанию для моего проекта) в папке в моей структуре папок приложения. Я указываю на это каждый раз, когда пытаюсь получить доступ к корзине в GCS, независимо от того, работаю я локально или в GAE. Как я уже сказал, все идет гладко, локально, но ничего из облака. Вот некоторый код.

 //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 GoogleCloudStorageStorageClient;

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

 

Комментарии:

1. Вы получаете какие-либо ошибки? что показывают журналы? Пожалуйста, добавьте более подробную информацию к вашему вопросу

2. Не удалось получить доступ к файлу учетных данных shew. Поэтому я изменил способ авторизации своей учетной записи службы, и это сработало

Ответ №1:

Решаемая, я, наконец, заработал. Похоже, проблема в том, как авторизовать мою учетную запись службы. Вместо

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

 

Он работает с

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