2011-09-12 2 views
6

Я пытаюсь сделать так, чтобы мой скрипт продемонстрировал test.jpg в ведро Amazon S3 через php. Вот что я до сих пор:Как загрузить файл с php и амазоном 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; 

Это просто сваливает из файла данных на этой странице. Я думаю, мне также нужно отправить заголовок content-disposition, который, как я думал, выполняется в методе get_object(), но это не так.

Примечание: Я использую SDK доступный здесь: http://aws.amazon.com/sdkforphp/

+0

Я не знаком с этой библиотекой PHP S3 (который один это? Может помочь, если вы сказали, что в этом вопросе, как и есть несколько из них.) Но тот факт, что вы speficially второпях '$ obj-> body' заставляет меня думать, что у объекта, который у вас есть, вероятно, есть отдельные заголовки и тело, и что, возможно, вам нужно эхо заголовок Content-Type согласно информации в '$ obj-> header', или что-то в этом направлении? –

+0

Я использую http://aws.amazon.com/sdkforphp/ – doremi

ответ

12

получил его на работу по echo'ing из заголовка типа содержимого, прежде чем echo'ing тело $ объекта.

$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 - это подсказка для браузера, как обрабатывать файл. встроенный, вложение и т. д. content-type определяет, какой файл IS. (изображение, документ, текст и т. д.) –

+0

- @ doremi Спасибо за решение этой проблемы, я долгое время боролся с ней ... –

+0

@MarcB как я отправляю этот файл как вложение по почте .. может у помогите мне PLZ .. Я использую PHP SDK от aws –

1

Я добавил заголовок Content-Disposition в 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

Оба эти метода работают для меня. Первый способ кажется более кратким.

$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(); 

Или более многословный, но все еще функциональный способ.

$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

Спасибо за обмен. – Brotheryura

+0

Спасибо! работал как шарм. –

+0

спасибо @ MatteoStohlman nd @Maximus .. но как я могу отправить этот файл в виде вложения по почте .. может у помочь мне PLZ .. –

1

Для PHP sdk3 изменить последнюю строку Maximus ответить

$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"]; 
Смежные вопросы