2011-09-12 43 views
6

Tôi đang cố gắng để làm cho nó để kịch bản của tôi sẽ hiển thị test.jpg trong một thùng S3 của Amazon thông qua php. Đây là những gì tôi có cho đến thời điểm này:Làm cách nào để tải xuống tệp với php và sdk Amazon S3?

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; 

Điều này chỉ loại bỏ dữ liệu tệp trên trang. Tôi nghĩ rằng tôi cũng cần phải gửi tiêu đề nội dung-disposition, mà tôi nghĩ đã được thực hiện trong phương thức get_object(), nhưng nó không phải là.

Lưu ý: Tôi đang sử dụng SDK có sẵn ở đây: http://aws.amazon.com/sdkforphp/

+0

Tôi không quen với điều đó thư viện PHP S3 (cái nào là nó? Có thể giúp đỡ nếu bạn nói rằng trong câu hỏi, như Nhưng thực tế bạn đang lặp lại chính xác '$ obj-> body' khiến tôi nghĩ rằng đối tượng bạn quay lại có thể có tiêu đề và phần thân riêng biệt, và có thể bạn cần phải echo tiêu đề Content-Type theo thông tin trong '$ obj-> tiêu đề', hoặc một cái gì đó dọc theo những dòng đó? –

+0

Tôi đang sử dụng http://aws.amazon.com/sdkforphp/ – doremi

Trả lời

12

Got nó hoạt động bằng cách echo'ing ra tiêu đề content-type trước echo'ing cơ thể $ đối tượng.

$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

bố cục nội dung là gợi ý cho trình duyệt cách xử lý tệp. nội tuyến, tệp đính kèm, v.v ... loại nội dung xác định tệp IS là gì. (hình ảnh, tài liệu, văn bản, vv ..) –

+0

- @ doremi cảm ơn vì đã giải quyết vấn đề này, tôi đã gặp khó khăn trong một thời gian ... –

+0

@MarcB cách tôi gửi tệp này dưới dạng tệp đính kèm trong thư .. bạn có thể giúp tôi plz .. tôi đang sử dụng PHP SDK aws –

1

Tôi đã thêm tiêu đề Content-Disposition vào 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

Cả hai phương pháp này đều phù hợp với tôi. Cách đầu tiên có vẻ ngắn gọn hơn.

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

Hoặc một cách dài dòng hơn nhưng vẫn hoạt động.

$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

Cảm ơn bạn đã chia sẻ. – Brotheryura

+0

Cảm ơn bạn! làm việc như người ở. –

+0

cảm ơn @ MatteoStohlman nd @Maximus .. nhưng làm thế nào tôi gửi tập tin này dưới dạng tệp đính kèm trong thư .. u có thể giúp tôi .. –

1

Đối với PHP sdk3 thay đổi dòng cuối cùng của Maximus trả lời

$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"]; 
Các vấn đề liên quan