2011-09-12 21 views
6

Staram się, aby mój skrypt wyświetlił test.jpg w wiadrze Amazon S3 za pośrednictwem php. Oto co mam do tej pory:Jak mogę pobrać plik z php i Amazon S3 SDK?

require_once('library/AWS/sdk.class.php'); 

$s3 = new AmazonS3($key, $secret); 

$objInfo = $s3->get_object_headers('my_bucket', 'test.jpg'); 
$obj = $s3->get_object('my_bucket', 'test.jpg', array('headers' => array('content-disposition' => $objInfo->header['_info']['content_type']))); 

echo $obj->body; 

To właśnie zrzuca się dane pliku na stronie. Myślę, że muszę również wysłać nagłówek zawartości, który, jak sądziłem, został zrobiony w metodzie get_object(), ale tak nie jest.

Uwaga: używam SDK dostępne tutaj: http://aws.amazon.com/sdkforphp/

+0

nie jestem zaznajomiony z tej biblioteki PHP S3 (co jeden to jest? Może pomóc, jeśli wspomnieć, że w odpowiedzi na pytanie, jak jest ich kilka). Ale fakt, że echo powtarzacie '$ obj-> body' powoduje, że myślę, że obiekt, który otrzymasz, ma prawdopodobnie osobne nagłówki i treść, i że być może potrzebujesz echa nagłówka Content-Type zgodnie z informacją zawartą w '$ obj-> header' lub czymś w tym stylu? –

+0

Używam http://aws.amazon.com/sdkforphp/ – doremi

Odpowiedz

12

uzyskałem go do pracy przez echo'ing się nagłówek Content-Type przed echo'ing ciało $ obiektu.

$objInfo = $s3->get_object_headers('my_bucket', 'test.jpg'); 
$obj = $s3->get_object('my_bucket', 'test.jpg'); 

header('Content-type: ' . $objInfo->header['_info']['content_type']); 
echo $obj->body; 
+1

content-disposition jest wskazówką dla przeglądarki, jak obsługiwać plik. inline, attachment, etc ... content-type określa, czym jest plik IS. (obraz, dokument, tekst, itp.) –

+0

- @ Doremi dzięki za rozwiązanie tego problemu, walczyłem z nim przez jakiś czas ... –

+0

@MarcB jak wysłać ten plik jako załącznik w poczcie .. czy możesz pomóż mi plz .. używam PHP SDK aws –

1

Dodałem nagłówek Content-Disposition do getAuthenticatedUrl();

// Example 
$timeOut = 3600; // in seconds 
$videoName = "whateveryoulike"; 
$headers = array("response-content-disposition"=>"attachment"); 
$downloadURL = $s3->getAuthenticatedUrl(FBM_S3_BUCKET, $videoName, FBM_S3_LIFETIME + $timeOut, true, true, $headers); 
8

Obie te metody działają dla mnie. Pierwszy sposób wydaje się bardziej zwięzły.

$command = $s3->getCommand('GetObject', array(
     'Bucket' => 'bucket_name', 
     'Key' => 'object_name_in_s3' 
     'ResponseContentDisposition' => 'attachment; filename="'.$my_file_name.'"' 
    )); 

    $signedUrl = $command->createPresignedUrl('+15 minutes'); 
    echo $signedUrl; 
    header('Location: '.$signedUrl); 
    die(); 

Lub bardziej rozwlekły, ale nadal funkcjonalny sposób.

$object = $s3->getObject(array(
    'Bucket' => 'bucket_name', 
    'Key' => 'object_name_in_s3' 
    )); 

    header('Content-Description: File Transfer'); 
    //this assumes content type is set when uploading the file. 
    header('Content-Type: ' . $object->ContentType); 
    header('Content-Disposition: attachment; filename=' . $my_file_name); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 

    //send file to browser for download. 
    echo $object->body; 
+0

Dziękuję za udostępnienie. – Brotheryura

+0

Dziękujemy! pracował jak urok. –

+0

dzięki @ MatteoStohlman nd @Maximus .. ale jak wysłać ten plik jako załącznik w mailu .. możesz mi pomóc plz .. –

1

dla PHP sdk3 zmienić ostatni wiersz Maximus odpowiedzieć

$object = $s3->getObject(array(
     'Bucket' => 'bucket_name', 
     'Key' => 'object_name_in_s3' 
    )); 

    header('Content-Description: File Transfer'); 
    //this assumes content type is set when uploading the file. 
    header('Content-Type: ' . $object->ContentType); 
    header('Content-Disposition: attachment; filename=' . $my_file_name); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 

    //send file to browser for download. 
    echo $object["Body"];