readfile()的替代方案

时间:2013-02-21 15:45:53

标签: php amazon-s3 amazon-ec2 readfile

我目前正在使用以下代码从我的Amazon S3帐户下载文件。

if(isset($_POST['file_name'])) {
$bucket = $_POST['bucket'];
$fname = $_POST['file_name'];
$accessKey = 'AKIAIEHFBME6F5Q62FTQ';
$secretKey = '<REMOVED>';
$file_type = pathinfo($fname, PATHINFO_EXTENSION);

$mp3_url = el_s3_getTemporaryMP3Link($accessKey, $secretKey, $bucket, $fname);    
$zip_url = el_s3_getTemporaryZipLink($accessKey, $secretKey, $bucket, $fname);


if ($file_type === "mp3") {
    header('Content-type: audio/mpeg3');
    header('Content-Disposition: attachment; filename="themixtapesite_'.$fname.'"');
    readfile($mp3_url);
    exit();
} else if ($file_type === "zip") {
    header('Content-type: application/zip');
    header('Content-Disposition: attachment; filename="themixtapesite_'.$fname.'"');
    readfile($zip_url);
    exit();
} else {
    echo "Sorry, File does not exist";
}

}

如您所见,它会检查文件扩展名是什么,然后将相关网址传递到read file()

使用S3的全部意义是减轻我的EC2服务器负载。 但是,似乎使用此方法下载通过EC2服务器从S3中提取文件的文件(通过iStat监视服务器负载,显示下载文件时活动增加)。

是否有其他方法可以直接从S3而不是通过EC2服务器下载文件?

更新:只是一个快速更新 - 我正在使用Nginx而不是apache,所以没有.htaccess,如果有人在想这个。

1 个答案:

答案 0 :(得分:1)

如果您有可公开访问的网址或已签名的网址。您可以使用位置重定向将其直接传递给客户端。

header('Location: ' . $myUrl);