簡體   English   中英

通過PHP SDK 2從S3中獲取Object的內容?

[英]Grabbing contents of Object from S3 via PHP SDK 2?

我一直試圖弄清楚如何從S3存儲桶中獲取內容以包含在ZipArchive中,以便在S3上存儲文件的客戶端,他們現在需要創建報告來保存由客戶推送到S3的文件。 我已經嘗試了以下PHP SDK 2 API(與PEAR一起安裝):

require 'AWSSDKforPHP/aws.phar';

use Aws\S3\S3Client;
use Aws\Common\Enum\Region;

$config = array(
    'key'    => 'the-aws-key',
    'secret' => 'the-aws-secret',
    'region' => Region::US_EAST_1
);

$aws_s3 = S3Client::factory($config);
$app_config['s3']['bucket'] = 'the-aws-bucket';
$app_config['s3']['prefix'] = '';
$attach_name = 'hosted-test-file.jpg';
try {
    $result = $aws_s3->getObject(
        array(
            'Bucket' => $app_config['s3']['bucket'],
            'Key' => $app_config['s3']['prefix'].$attach_name
        )
    );
    var_dump($result);
    $body = $result->get('Body');
    var_dump($body);
    $handle = fopen('php://temp', 'r');
    $content = stream_get_contents($handle);
    echo "String length: ".strlen($content);
} catch(Aws\S3\Exception\S3Exception $e) {
    echo "Request failed.<br />";
}

但是,它返回的只是一個Guzzle\\Http\\EntityBody對象,不知道如何抓取實際內容,所以我可以把它推入zip文件。

抓住對象

object(Guzzle\Service\Resource\Model)[126]
    protected 'structure' => object(Guzzle\Service\Description\Parameter)[109]
    protected 'name' => null
    protected 'description' => null
    protected 'type' => string 'object' (length = 6)
    protected 'required' => boolean false
    protected 'enum' => null
    protected 'additionalProperties' => boolean true
    protected 'items' => null
    protected 'parent' => null
    protected 'ref' => null
    protected 'format' => null
    protected 'data' => array (size = 11)
        'Body' => object(Guzzle\Http\EntityBody)[97]
            protected 'contentEncoding' => boolean false
            protected 'rewindFunction' => null
            protected 'stream' => resource(292, stream)
            protected 'size' => int 3078337
            protected 'cache' => array (size = 9)
            ...
        'DeleteMarker' => string '' (length = 0)
        'Expiration' => string '' (length = 0)
        'WebsiteRedirectLocation' => string '' (length = 0)
        'LastModified' => string 'Fri, 30 Nov 2012 21:07:30 GMT' (length = 29)
        'ContentType' => string 'binary/octet-stream' (length = 19)
        'ContentLength' => string '3078337' (length = 7)
        'ETag' => string '"the-etag-of-the-file"' (length = 34)
        'ServerSideEncryption' => string '' (length = 0)
        'VersionId' => string '' (length = 0)
        'RequestId' => string 'request-id' (length = 16)

從身體歸來

object(Guzzle\Http\EntityBody)[96]
    protected 'contentEncoding' => boolean false
    protected 'rewindFunction' => null
    protected 'stream' => resource(292, stream)
    protected 'size' => int 3078337
    protected 'cache' => array (size = 9)
        'wrapper_type' => string 'php' (length = 3)
        'stream_type' => string 'temp' (length = 4)
        'mode' => string 'w+b' (length = 3)
        'unread_bytes' => int 0
        'seekable' => boolean true
        'uri' => string 'php://temp' (length = 10)
        'is_local' => boolean true
        'is_readable' => boolean true
        'is_writable' => boolean true

// Echo of strlen()
String length: 0

任何信息都將受到高度贊賞,謝謝!

我想了解它,但我找到了一個指向正確方向的要點,以獲取您需要執行以下操作的文件內容:

require 'AWSSDKforPHP/aws.phar';

use Aws\S3\S3Client;
use Aws\Common\Enum\Region;

$config = array(
    'key'    => 'the-aws-key',
    'secret' => 'the-aws-secret',
    'region' => Region::US_EAST_1
);

$aws_s3 = S3Client::factory($config);
$app_config['s3']['bucket'] = 'the-aws-bucket';
$app_config['s3']['prefix'] = '';
$attach_name = 'hosted-test-file.jpg';
try {
    $result = $aws_s3->getObject(
        array(
            'Bucket' => $app_config['s3']['bucket'],
            'Key' => $app_config['s3']['prefix'].$attach_name
        )
    );
    $body = $result->get('Body');
    $body->rewind();
    $content = $body->read($result['ContentLength']);
} catch(Aws\S3\Exception\S3Exception $e) {
    echo "Request failed.<br />";
}

響應的主體存儲在Guzzle\\Http\\EntityBody對象中。 這用於保護您的應用程序免於下載超大文件和內存不足。

如果需要將EntityBody對象的內容用作字符串,則可以將對象強制轉換為字符串:

$result = $s3Client->getObject(array(
    'Bucket' => $bucket,
    'Key'    => $key
));

// Cast as a string
$bodyAsString = (string) $result['Body'];

// or call __toString directly
$bodyAsString = $result['Body']->__toString();

如果需要,您還可以直接下載到目標文件:

use Guzzle\Http\EntityBody;

$s3Client->getObject(array(
  'Bucket' => $bucket,
  'Key'    => $key,
  'command.response_body' => EntityBody::factory(fopen("/tmp/{$key}", 'w+'))
));

調用getObject ,可以傳入一組選項。 在這些選項中,您可以指定是否要將對象下載到文件系統。

$bucket = "bucketName";
$file = "fileName";
$downloadTo = "path/to/save";

$opts = array(  // array of options
    'fileDownload' => $downloadTo . $file   // tells the SDK to download the 
                                             // file to this location
);

$result = $aws_s3->getObject($bucket, $file, $opts);

getObject參考

我對版本2.00 SDK並不熟悉,但看起來你已經在php://temp上傳遞了一個流上下文。 從查看您更新的問題和簡要瀏覽文檔,似乎可以使用以下流:

$result = $aws_s3->getObject(
    array(
        'Bucket' => $app_config['s3']['bucket'],
        'Key' => $app_config['s3']['prefix'].$attach_name
    )
);
$stream = $result->get('stream');
$content = file_get_contents($stream);
<?php
   $o_iter = $client->getIterator('ListObjects', array(
    'Bucket' => $bucketname
   ));
   foreach ($o_iter as $o) {
    echo "{$o['Key']}\t{$o['Size']}\t{$o['LastModified']}\n";
   }

這對我有用:

$tempSave = 'path/to/save/filename.txt';

return $this->S3->getObject([
     'Bucket' => 'test',
     'Key'    => $keyName,
     'SaveAs' => $tempSave,
]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM