Как скачать файл с помощью php и Amazon S3 sdk? - PullRequest
13 голосов
/ 12 сентября 2011

Я пытаюсь сделать так, чтобы мой скрипт показывал test.jpg в корзине Amazon S3 через php.Вот что у меня есть:

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;

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

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

Ответы [ 5 ]

17 голосов
/ 08 августа 2015

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

    $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;
13 голосов
/ 12 сентября 2011

Получил это, отразив заголовок типа контента, прежде чем повторить тело $ object.

$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;
3 голосов
/ 20 июня 2017

Для 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"];
1 голос
/ 20 сентября 2011

Я добавил заголовок 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 );
0 голосов
/ 14 февраля 2019

Если вы все еще ищете соответствующий ответ в 2019+, с AWS SDK для PHP 3.x и, в частности, «2006-03-01» с композитором, мне помогло следующее


...

/**
 * Download a file
 * 
 * @param   string  $object_key
 * @param   string  $file_name
 * @return  void
 */
function download($object_key, $file_name = '') {
  if ( empty($file_name) ) {
    $file_name = basename($file_path);
  }
  $cmd = $s3->getCommand('GetObject', [
    'Bucket'                        => '<aws bucket name>',
    'Key'                           => $object_key,
    'ResponseContentDisposition'    => "attachment; filename=\"{$file_name}\"",
  ]);
  $signed_url = $s3->createPresignedRequest($cmd, '+15 minutes') // \GuzzleHttp\Psr7\Request
                ->getUri() // \GuzzleHttp\Psr7\Uri
                ->__toString();
  header("Location: {$signed_url}");
}
download('<object key here>', '<file name for download>');

ПРИМЕЧАНИЕ. Это решение для тех, кто хотел бы избежать проблем, которые могут возникнуть при использовании прокси-сервера загрузки через свои серверы с помощью прямой ссылки для загрузки из AWS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...