[英]Amazon S3 force MP3 file download bypassing web server
我一直在尝试寻找一种从Amazon S3强制下载MP3文件的方法,但是我发现的所有实现都将通过Web服务器示例传递文件:
S3->我的Web服务器->客户端。
如何链接到Amazon S3上的文件,该文件将直接从Amazon s3进行下载而无需通过我的Web服务器?
您的答案是HTML 5
<a href="$download_link" download="$file_name">Click Me</a>
这迫使浏览器将文件保存为“保存”
您需要设置S3对象的这些元数据:
Content-Type: "application/octet-stream"
Content-Disposition: "attachment"
有时仅设置Content-Disposition
就足够了。 您也可以从S3控制台或通过AWS Api执行此操作。
您可以直接引用上传到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提供的工具箱。 否则,Amazon S3 Web控制台允许您创建签名的链接。
关于已签名链接的最重要的事情是,您可以指定链接过期的时间。 这可以是一个救生员,因为您可以动态创建链接,例如,链接将在30分钟后失效。 这有助于防止滥用和深度链接,但这当然是公开使用私有S3对象的最复杂方式,当然也需要服务器。
尽管从技术上来说,可以让某种类型的客户端JavaScript为您的链接签名,但是客户端代码将需要包括您的访问密钥和秘密密钥,这将是一个主要的安全漏洞,无论您对其进行多大程度的混淆。 规则#1,永远不要创建任何杂乱无章的物品,包括您的亚马逊钥匙,无论它们多么混乱。
然后是上面的对象的直接url是私有的并且需要签名的示例:
您不需要通过Web服务器传递对象的实际数据,可以使用上述详细方法向任何用户发出指向S3的直接链接。 请注意,为确保在上载时正确设置Content-Type,大多数工具会自动执行此操作。 如果设置不正确,该文件将无法正确打开。 例如,这是控制图片下载和保存(错误的Content-Type或默认二进制类型)还是仅在浏览器中显示(正确的Content-Type)的控件。
祝你好运,希望这会有帮助。
将文件公开,您不需要任何类型的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;
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.