2010-05-19 54 views
5

我使用亞馬遜S3來放mp3文件,然後讓我們的網站訪問者從亞馬遜AWS下載MP3。我使用S3Fox來管理文件,一切似乎都正常工作,直到最近我們收到很多來自訪問者的抱怨,說mp3是通過瀏覽器流式傳輸的,而不是顯示瀏覽器保存對話框。 我嘗試了一些mp3,並注意到對於某些mp3,保存對話框出現,而對於其他一些則通過瀏覽器進行流式傳輸。我能做些什麼來強制mp3文件將被下載,而不是通過網絡瀏覽器進行流式傳輸....亞馬遜AWS S3強制下載MP3文件而不是流它

任何幫助將不勝感激。 感謝

回答

9

爲了做到這一點,你需要設置Content-Disposition頭:

Content-disposition: attachment; filename=song.mp3 

我不認爲這是可能的S3Fox。您可以使用Bucket Explorer(不是免費)或編寫腳本來上傳文件。

+0

嗯,那是什麼樣的腳本?你能用這樣做嗎? s3cmd(http://s3tools.org/s3cmd)? – Jonik 2010-05-19 16:54:26

+0

我不確定s3cmd。看到這個論壇帖子http://developer.amazonwebservices.com/connect/thread.jspa?messageID=67395。您可以使用REST API來設置標題。亞馬遜爲許多語言提供了庫(Ruby,python,C#)。您可以使用您選擇的語言編寫腳本。 – kgiannakakis 2010-05-20 07:39:05

+0

感謝您的回覆,我使用CloudBerry(免費軟件)來設置內容標題。它工作正常!非常感謝 – Calua 2010-05-21 10:35:26

2

好的,你問這個問題已經很長時間了,但是我有同樣的問題,我想和社區分享我的解決方案,以防其他人需要解決這個問題。當然,您可以從Amazon S3控制檯更改Content-Type和Content-Disposition,但有趣的是以編程方式進行。

下面的代碼工作正常,我:

require_once '../sdk-1.4.2.1/sdk.class.php'; 

// Instantiate the class 
$s3 = new AmazonS3(); 

// Copy object over itself and modify headers 
$response = $s3->copy_object(
    array(// Source 
     'bucket' => 'your_bucket', 
     'filename' => 'Key/To/YourFile' 
    ), 
    array(// Destination 
     'bucket' => 'your_bucket', 
     'filename' => 'Key/To/YourFile' 
    ), 
    array(// Optional parameters 
     'headers' => array(
      'Content-Type' => 'application/octet-stream', 
      'Content-Disposition' => 'attachment' 
     ) 
    ) 
); 

// Success? 
var_dump($response->isOK()); 

希望它能夠幫助其他有同樣的問題掙扎。

2

這最終成爲我從AWS S3強制下載文件的解決方案。

在Safari瀏覽器中,文件以.html文件格式下載,直到我停止返回讀取文件並僅僅運行該功能。

public function get_download($upload_id) 
    { 
    try { 
     $upload = Upload::find($upload_id); 
     if ($upload->deleted) 
     throw new Exception("This resource has been deleted."); 

     if ($upload->filename == '') 
     throw new Exception("No downloadable file found. Please email [email protected] for support."); 

     header("Content-Description: File Transfer"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Disposition: attachment; filename={$upload->uploaded_filename};"); 

     readfile("https://s3.amazonaws.com/stackoverflow/uploads/" . $upload->filename); 
     exit; 
    } catch(Exception $e) { 
     return $e->getMessage(); 
    } 
    } 
+6

這似乎並不是強制從S3下載,而是通過您的網絡服務器將文件從S3推回,捆綁您的web服務器資源以強制下載。 – davidjbullock 2013-06-19 16:11:29

+0

@davidjbullock不知道它是否是,但這是一個不好的例子。我更新了我的例子,以反映我做得更好。 – 2013-06-20 00:22:26

0

在s3管理控制檯窗口中,右鍵單擊並選擇屬性。

點擊元數據。

單擊添加更多的元數據

重點:內容處置 價值:附件

保存。就這樣。

這是圖像http://i.imgur.com/2PWK3xF.jpg