亚马逊S3强制MP3文件下载绕过Web服务器

时间:2013-07-19 01:33:23

标签: php amazon-s3 download

我一直试图找到一种方法来强制从Amazon S3下载MP3文件,但我发现的所有实现都会通过Web服务器示例传递文件:

S3 - >我的Web服务器 - >客户端。

如何链接到Amazon S3上的文件,该文件会强制从Amazon s3直接下载,而不会让文件通过我的网络服务器?

4 个答案:

答案 0 :(得分:2)

你的答案是HTML 5

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

此强制浏览器将文件保存为“保存”

答案 1 :(得分:1)

您需要设置S3对象的这些元数据:

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

有时仅设置Content-Disposition就足够了。 您也可以从S3控制台或通过AWS Api执行此操作。

答案 2 :(得分:-2)

您可以直接将上传的任何对象引用到您的Amazon S3存储桶,就像它本身就是一个Web服务器一样。

例如,如果您的存储桶名称为xyz100且您上传了名为music.mp3的mp3,则可以使用以下链接格式直接从S3下载:

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

您知道可以通过基于Web的Amazon Web Services控制台将对象/文件上传到S3,也可以使用任何免费软件工具。

将对象上载到S3后,您可以为对象指定ACL或安全策略。默认情况下,对象是私有的,如果您尝试访问上面显示的文件,则会收到拒绝访问错误消息。

解决此问题的第一种方法是将对象设为公共,这样就不需要在URL本身中使用任何特殊签名。但是,如果您认为该文件可能会被高带宽下载滥用或在其他人的网站上深层链接,那么将对象公开可能会成为一种风险。

第二种方法是将对象保密,并创建包含签名的直接URL。这需要更多的技巧,但有一些PHP工具包可以轻松地为您创建签名链接,包括亚马逊自己提供的工具包。否则,Amazon S3 Web控制台允许您创建签名链接。

签名链接最重要的一点是您可以指定链接过期的时间。这可以成为救生员,因为您可以动态创建链接,例如在30分钟后过期。这有助于防止滥用和深层链接,但当然是公开使用私有S3对象的最复杂方式,当然还需要服务器。

虽然技术上可以让某种类型的客户端JavaScript为您签名链接,但客户端代码需要包含您的访问密钥和密钥,这将是一个主要的安全漏洞,无论您对其进行多少混淆。规则#1,永远不会创建任何进入野外的物品,包括你的亚马逊钥匙,无论它们有多么混乱。

这里将是上述对象的直接网址如果是私有的并且需要签名的示例:

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

您无需通过Web服务器传递对象实际数据,您可以使用上面详述的方法向任何用户发出指向S3的直接链接。请注意,为确保在上传时正确设置内容类型,大多数工具会自动执行此操作。如果设置不正确,文件将无法正确打开。例如,如果下载并保存图片(不正确的内容类型或默认二进制类型),或者只是在浏览器中显示(正确的内容类型),这就是控制。

祝你好运,希望这会有所帮助。

答案 3 :(得分:-2)

将文件公开,您不需要任何类型的AWS客户端库来访问它。您可以使用您选择的文件检索机制来获取文件。

您需要更改内容类型。在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;
?>