2013-02-21 64 views
2

我目前使用以下代碼從我的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

如果您有可公開訪問的網址或簽名的網址。您可以使用位置重定向將其直接傳遞給客戶端。

header('Location: ' . $myUrl);

+0

謝謝,但我的那個問題是,如果該文件是它只是在瀏覽器中播放MP3。我想強制下載該文件。我認爲'Content-Disposition:attachment;'應該告訴瀏覽器下載文件而不是播放它,但是如果將'readfile()'改爲'header('location),它似乎沒有做任何事情。 ..)' – 2013-02-21 18:50:06

+0

你應該能夠在s3上設置文件頭。我從來沒有試圖用這種方式設置內容處置標題,但它可能工作。 – datasage 2013-02-21 18:52:02

+0

對不起,你在那裏失去了我? – 2013-02-21 18:56:49