首页 文章

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

提问于
浏览
2

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

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

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

4 回答

  • 1

    你的答案是HTML 5

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

    这个强制浏览器保存文件就像“保存”

  • -2

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

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

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

  • -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,永远不会创建任何进入野外的物品,包括你的亚马逊钥匙,无论它们有多么混乱 .

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

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

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

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

  • 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;
    ?>
    

相关问题