2011-09-12 25 views
6

Estoy tratando de hacerlo para que mi script muestre test.jpg en un cubo de Amazon S3 a través de php. Esto es lo que tengo hasta ahora:¿Cómo descargo un archivo con php y 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; 

Esto se vuelca los datos del archivo en la página. Creo que también necesito enviar el encabezado content-disposition, que pensé que se estaba haciendo en el método get_object(), pero no es así.

Nota: Estoy usando el SDK disponible aquí: http://aws.amazon.com/sdkforphp/

+0

No estoy familiarizado con esa librería PHP S3 (¿cuál es? Podría ayudar si usted ha mencionado que en la pregunta, como se hay varios de ellos). Pero el hecho de que te estés haciendo eco de '$ obj-> body' me hace pensar que el objeto que obtienes probablemente tenga encabezados y cuerpo separados, y que tal vez necesites hacer eco de un encabezado Content-Type de acuerdo con la información en '$ obj-> header', o algo similar? –

+0

Estoy usando http://aws.amazon.com/sdkforphp/ – doremi

Respuesta

12

se puso a trabajar por echo'ing el encabezado de tipo de contenido antes de echo'ing el cuerpo $ objeto.

$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 es una sugerencia para el navegador sobre cómo manejar el archivo. inline, attachment, etc ... content-type define qué es el archivo. (imagen, documento, texto, etc.) –

+0

- @ doremi gracias por resolver este problema, estuve luchando durante bastante tiempo con él ... –

+0

@MarcB cómo envío este archivo como archivo adjunto en el correo .. ¿puede usted ayúdame por favor ... estoy usando PHP SDK de aws –

1

He añadido el encabezado Content-Disposition al 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

Ambos métodos funcionan para mí. La primera forma parece más conciso.

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

O una manera más prolija pero funcional.

$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

Gracias por compartir. – Brotheryura

+0

¡Gracias! trabajado como un encanto. –

+0

gracias @ MatteoStohlman nd @Maximus .. pero cómo envío este archivo como un archivo adjunto en el correo ... me pueden ayudar por favor ... –

1

Para PHP sdk3 cambiar la última línea de Máximo responder

$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"];