2013-07-19 17 views
2

我一直試圖找到一種方法來強制的MP3文件下載從Amazon S3但我發現會通過文件通過web服務器實例中實現的:亞馬遜S3力的MP3文件下載繞過Web服務器

S3 - >我的Web服務器 - >客戶端。

我該如何鏈接到Amazon S3上的文件,該文件將直接強制從亞馬遜s3下載文件,而無需讓文件通過我的網絡服務器?

+0

相似但不重複..這是關於特定強制下載而不通過網絡服務器傳遞文件 –

回答

2

你的答案是HTML 5

<a href="$download_link" download="$file_name">Click Me</a> 

這股力量的瀏覽器保存如文件「保存」

+0

這不是一個壞主意。我不知道那是存在的。對於不支持HTML 5的瀏覽器是否有解決方法? –

-2

您可以直接引用您上傳到亞馬遜S3存儲的任何對象,就好像它是一個Web服務器本身。

例如,如果你的水桶名字是xyz100而且您已上傳的MP3的music.mp3,你可以從S3使用下面的鏈接的格式,直接下載:

https://s3.amazonaws.com/xyz100/music.mp3

你知道你可以通過基於Web的亞馬遜Web服務控制檯將對象/文件上傳到S3,或使用任何免費軟件工具。

當對象上傳到S3時,您可以指定對象的ACL或安全策略。默認情況下,對象是私有的,如果你試圖訪問如上所示的文件,你將得到一個拒絕訪問的錯誤信息。

解決這個問題的第一種方法是使對象成爲公共對象,這樣就不需要url本身中的任何特殊簽名。但是,如果您認爲該文件可能會被高帶寬下載濫用,或者在其他人的網站上進行深度鏈接,則公開對象可能會成爲一種風險。

第二種方法是讓對象保持私有狀態,並創建一個包含簽名的直接url。這需要更多的詭計,但有一些PHP工具包可以輕鬆地爲您創建簽名鏈接,包括Amazon提供的工具包。否則,Amazon S3 Web控制檯允許您創建簽名鏈接。

關於簽名鏈接最重要的是您可以指定鏈接將過期的時間。這可以成爲一個救生員,因爲您可以即時創建鏈接,例如,該鏈接將在30分鐘內過期。這有助於防止濫用和深層鏈接,但當然是公開使用私有S3對象的最複雜方式,當然還需要服務器。

儘管技術上可能讓某種類型的客戶端JavaScript爲您簽名鏈接,但客戶端代碼需要包含您的訪問密鑰和密鑰,這將成爲一個主要的安全漏洞,無論您對它進行多少混淆。規則#1,不要創造任何進入野外的物品,包括你的亞馬遜鍵,不管它們有多混亂。

那麼,這將是上述目的的直接網址是什麼樣子,如果它是私人的,並需要簽名的例子:

https://s3.amazonaws.com/xyz100/music.mp3?Expires=1687832834&Signature=GTje51Mo47BfkGqS1gO0Ns%2FrHUk%3D

你並不需要傳遞的對象通過實際數據您的Web服務器,您可以使用上面詳述的方法向任何用戶發送與S3的直接鏈接。請注意,確保在上傳時正確設置Content-Type,大多數工具都會自動執行此操作。如果設置不正確,文件將無法正確打開。例如,如果下載並保存圖片(不正確的Content-Type或默認的二進制類型),或者只是在瀏覽器中顯示(正確的Content-Type),則這是控制的內容。

祝你好運,希望這會有所幫助。

-2

使文件公開,您不應該需要任何種類的AWS客戶端庫來訪問它。您可以使用您選擇的文件檢索機制來抓取文件。

您需要更改Content-Type。在S3控制檯中,右鍵單擊對象並選擇屬性,然後在元數據下。你也可以做到這一點編程:http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type

<?php 
$file = $_GET['file']; 
header ("Content-type: octet/stream"); 
header ("Content-disposition: attachment; filename=".$file.";"); 
header("Content-Length: ".filesize($file)); 
readfile($file); 
exit; 
?> 
+0

不會readfile()通過服務器傳遞文件?我試圖讓它直接進入客戶端 –

1

您需要設置S3對象的這些元數據:

Content-Type: "application/octet-stream" 
Content-Disposition: "attachment" 

有時這是不夠的設定Content-Disposition只。 您也可以通過S3控制檯或通過AWS Api執行此操作。