Laravel: как загрузить файл PDF прямо в корзину Google Cloud Storage без предварительного сохранения локально

Я использую пакет google/cloud-storage в API и успешно загружаю файлы PDF в облако Google Ведро для хранения. Однако файлы PDF сначала сохраняются локально, прежде чем они будут загружены в корзину Google Cloud Storage.

Как я могу не сохранять их локально и вместо этого загружать их непосредственно в корзину Google Cloud Storage? Я планирую разместить API на Google App Engine. Это сообщение для этого.

Вот чем я сейчас занимаюсь:

$filename = $request['firstname'] . '.pdf';
$fileStoragePath = '/storage/pdf/' . $filename;
$publicPath = public_path($fileStoragePath);

$pdf = App::make('dompdf.wrapper');
$pdf->loadView('pdfdocument', $validatedData)
$pdf->save($publicPath); 

$googleConfigFile = file_get_contents(config_path('googlecloud.json'));
$storage = new StorageClient([
    'keyFile' => json_decode($googleConfigFile, true)
]);
$storageBucketName = config('googlecloud.storage_bucket');
$bucket = $storage->bucket($storageBucketName);
$fileSource = fopen($publicPath, 'r');
$newFolderName = $request['firstname'].'_'.date("Y-m-d").'_'.date("H:i:s");
$googleCloudStoragePath = $newFolderName.'/'.$filename;

/*
*  Upload a file to the bucket.
*  Using Predefined ACLs to manage object permissions, you may
*  upload a file and give read access to anyone with the URL.
*/
$bucket->upload($fileSource, [
    'predefinedAcl' => 'publicRead',
    'name' => $googleCloudStoragePath
]);

Можно ли загружать файлы в корзину Google Cloud Storage без предварительного локального сохранения?

Спасибо за помощь.


person aghwotu    schedule 21.04.2021    source источник
comment
Вы написали статью, на которую ссылается ваш вопрос? Хорошая статья. Я не знаю библиотеки DOMPDF, но SDK Google Cloud Storage PHP поддерживает PSR StreamInterface. Если ваша библиотека PDF поддерживает StreamInterface, вы можете связать их вместе. googleapis. github.io/google-cloud-php/#/docs/cloud-storage/ И https://github.com/php-fig/http-message/blob/1.0.1/src/StreamInterface.php   -  person John Hanley    schedule 22.04.2021
comment
Спасибо. Да, я написал статью.   -  person aghwotu    schedule 22.04.2021


Ответы (1)


Я не проверял этот код, но член класса PDF output() возвращает строку.

$pdf = App::make('dompdf.wrapper');
$pdf->loadView('pdfdocument', $validatedData)

...

$bucket->upload($pdf->output(), [
    'predefinedAcl' => 'publicRead',
    'name' => $googleCloudStoragePath
]);

Вы можете просто клиентский код. Заменять:

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

с участием

$storage = new StorageClient([
    'keyFilePath' => config_path('googlecloud.json')
]);
person John Hanley    schedule 22.04.2021