AWS S3 getObject не может читать содержимое объекта через PHP SDK - PullRequest
0 голосов
/ 28 августа 2018

Я пытался прочитать содержимое объекта s3 с помощью приведенного ниже кода.

$content = $s3Client->getObject(
                        array(
                            'Bucket'=> $bucketName,
                            'Key' =>  $pathToObject,
                            'ResponseContentType' => 'text/plain',
                        )
                    );

И я получил ответ ниже

GuzzleHttp \ Psr7 \ Stream Object ( [stream: GuzzleHttp \ Psr7 \ Stream: private] => Идентификатор ресурса # 87 [size: GuzzleHttp \ Psr7 \ Stream: private] => [seekable: GuzzleHttp \ Psr7 \ Stream: private] => 1 [читабельно: GuzzleHttp \ Psr7 \ Stream: private] => 1 [доступный для записи: GuzzleHttp \ Psr7 \ Stream: private] => 1 [uri: GuzzleHttp \ Psr7 \ Stream: private] => php: // temp [customMetadata: GuzzleHttp \ Psr7 \ Stream: private] => Массив ( )

)

Любая помощь будет полезна для чтения содержимого объекта в S3.

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

На самом деле это возвращаемый объект Psr7 \ Stream.

Так что, если нам нужно получить содержимое из потока PSR, нам нужно вызвать метод getContents () из объекта.

<?php

$s3Client = new Aws\S3\S3Client(array(
    'stats'   => TRUE,
    'http'    => array(
        'verify' => FALSE,
        'connect_timeout' => 30
    ),
    'version'     => 'latest'
));     

$result = $s3Client->getObject(array(
    'Key'    => $filename,
    'Bucket' => $bucketName
));

echo $result['Body']->getContents();
//Also you can get metadata like this print_r($result['Body']->getMetadata());

Надеюсь, это поможет кому-то, кто на самом деле использует SDK версии 3.

Спецификация здесь https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.Stream.html

0 голосов
/ 04 декабря 2018

getObject в AWS S3 возвращает потоковый объект, который может быть визуализирован двумя способами.

  1. Как указано в документации aws S3 , вы можете отправить ответ прямо в браузер, установив заголовок и распечатав тело ответа

require 'vendor/autoload.php';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

try {
    // Get the object.
    $result = $s3->getObject([
        'Bucket' => $bucket,
        'Key'    => $keyname
    ]);

    // Display the object in the browser.
    header("Content-Type: {$result['ContentType']}");
    echo $result['Body'];
} catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
  1. Вы можете использовать функцию getUri (), которая также будет возвращать Object, для этого вы можете использовать __toString ()

// В моем случае мне нужно создать предварительно заданный запрос, так как я включил Шифрование

$command = $s3Client->getCommand('GetObject', [
  'Bucket' => $bucket_name,
  'Key'    => $file_name
]);

$result = $s3Client->createPresignedRequest($command, '+10 minutes');

$presignedUrl = $result->getUri()->__toString();

// Решение для получения URI без прохождения предварительно заданного запроса

    $result = $s3Client->getObject([
       'Bucket' => $bucket_name,
       'Key'    => $file_name
     ]);
    $fileUrl = $result->getUri()->__toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...