2012-12-03 26 views
10

Tôi đã cố gắng tìm cách lấy nội dung từ một thùng S3 để bao gồm trong một ZipArchive cho một khách hàng đang lưu trữ các tệp trên S3, bây giờ họ cần tạo các báo cáo giữ các tệp đã được đẩy lên S3 bằng khách hàng. Tôi đã thử những điều sau với 2 API PHP SDK (cài đặt với PEAR):Lấy nội dung của đối tượng từ S3 thông qua PHP SDK 2?

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 />"; 
} 

Tuy nhiên, tất cả nó trả về là một đối tượng Guzzle\Http\EntityBody, không chắc chắn làm thế nào để lấy các nội dung thực tế vì vậy tôi có thể đẩy nó vào zip tập tin.

Grabbing Object

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) 

Returned from Body

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 

Mọi thông tin sẽ được đánh giá cao, cảm ơn!

Giải pháp

Nó cho tôi một thời gian để con số nó ra nhưng tôi đã có thể tìm thấy một ý chính mà chỉ cho tôi đi đúng hướng, để có được nội dung của các tập tin mà bạn cần phải làm như sau :

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 />"; 
} 
+0

Nếu bạn thực sự cần lấy tài nguyên luồng PHP cơ bản từ đối tượng EntityBody, bạn có thể tất cả phương thức 'getStream()'. Xem http://guzzlephp.org/api/class-Guzzle.Http.EntityBody.html cho tài liệu API của đối tượng EntityBody. –

Trả lời

14

Cơ thể của phản ứng được lưu trữ trong một đối tượng Guzzle\Http\EntityBody. Điều này được sử dụng để bảo vệ ứng dụng của bạn khỏi tải xuống các tệp cực lớn và hết bộ nhớ.

Nếu bạn cần phải sử dụng các nội dung của đối tượng EntityBody như là một chuỗi, bạn có thể cast đối tượng đến một chuỗi:

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

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

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

Bạn cũng có thể tải trực tiếp đến tập tin mục tiêu nếu cần thiết:

use Guzzle\Http\EntityBody; 

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

Khi gọi getObject, bạn có thể chuyển một loạt tùy chọn. Trong các tùy chọn này, bạn có thể chỉ định nếu bạn muốn tải đối tượng xuống hệ thống tệp của mình.

$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 Reference

+0

Tôi đang sử dụng PHP SDK 2, đó là SDK đầu tiên. Các tài liệu thích hợp là [ở đây] (http://docs.amazonwebservices.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html). – OpensaurusRex

+1

Ah, tệ của tôi. Bỏ qua câu trả lời của tôi trong trường hợp đó. Tài liệu của SDK 2 thiếu đáng buồn so với tài liệu của 1.5. – xbonez

+0

Vâng, đó là lý do tại sao cuối cùng tôi quyết định chuyển sang stackoverflow cho câu trả lời vì tôi đã thử mọi thứ trong tài liệu lol. Tôi chắc chắn ai đó đã tìm ra. :) – OpensaurusRex

0

Tôi không phải là quen thuộc với phiên bản 2.00 SDK, nhưng có vẻ như bạn đã được thông qua một bối cảnh dòng trên php://temp. Từ nhìn vào câu hỏi cập nhật của bạn và từ một cái nhìn thoáng qua tài liệu hướng dẫn, có vẻ như các dòng có thể có sẵn như:

$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); 
+0

Ồ, điều đó có nghĩa là gì? Hãy để tôi kiểm tra nó thật nhanh. – OpensaurusRex

+0

Tôi đã thêm nhiều đầu ra từ các đối tượng, có vẻ như nó đang cố gắng trả về 'binary/octet-stream'. – OpensaurusRex

+0

Tôi đã xem qua câu hỏi được cập nhật của bạn và tài liệu SDK và đã cập nhật câu trả lời của tôi. Có vẻ như xử lý luồng đã có sẵn trên cả đối tượng 'Guzzle \ Service \ Resource \ Model' và đối tượng' Guzzle \ Http \ EntityBody' được lồng bên trong nó. Câu trả lời của tôi là chỉ nhận được luồng từ đối tượng cấp cao nhất. –

0
<?php 
    $o_iter = $client->getIterator('ListObjects', array(
    'Bucket' => $bucketname 
    )); 
    foreach ($o_iter as $o) { 
    echo "{$o['Key']}\t{$o['Size']}\t{$o['LastModified']}\n"; 
    } 
+1

Các câu trả lời chỉ có mã thường không hữu ích. Hãy giải thích những gì bạn đang làm và tại sao. – MattDMo

+0

Điều này không liên quan gì đến câu hỏi được hỏi. – Exit

Các vấn đề liên quan