【问题标题】:Amazon AWS S3 to Force Download Mp3 File instead of Stream ItAmazon AWS S3 强制下载 Mp3 文件而不是流式传输
【发布时间】:2011-02-21 07:50:12
【问题描述】:

我正在使用 Amazon S3 来放置 mp3 文件,然后允许我们的网站访问者从 Amazon AWS 下载 mp3。我使用 S3Fox 来管理文件,一切似乎都运行良好,直到最近我们收到很多访客抱怨 mp3 是通过浏览器流式传输的,而不是显示浏览器保存对话框。 我尝试了一些 mp3,并注意到对于一些 mp3,会出现保存对话框,而对于其他一些,它们是通过浏览器流式传输的。我能做些什么来强制下载 mp3 文件而不是通过网络浏览器流式传输....

任何帮助将不胜感激。 谢谢

【问题讨论】:

    标签: amazon-s3 amazon-web-services content-disposition


    【解决方案1】:

    为此,您需要设置 Content-Disposition 标头:

    Content-disposition: attachment; filename=song.mp3
    

    我认为这对于 S3Fox 是不可能的。您可以使用Bucket Explorer(不是免费的)或编写脚本来上传文件。

    【讨论】:

    • 嗯,那会是什么脚本?你能做到这一点吗? s3cmd (s3tools.org/s3cmd)?
    • 我不确定 s3cmd。请参阅此论坛帖子developer.amazonwebservices.com/connect/…。您可以使用 REST API 来设置标头。 Amazon 为多种语言(Ruby、python、C#)提供库。您可以使用您选择的语言来编写脚本。
    • 感谢您的回复,我正在使用 CloudBerry(免费软件)来设置内容标题。它工作正常!非常感谢
    • 感谢@kgiannakakis,很好的解决方案。我使用 Cloudberry Explorer for S3 设置标题。
    【解决方案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()); 
    

    希望它可以帮助其他遇到同样问题的人。

    【讨论】:

      【解决方案3】:

      这最终成为我从 AWS S3 强制下载文件的解决方案。

      在 safari 中,文件以 .html 文件的形式下载,直到我停止返回 readfile 并单独运行该函数。

        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 info@clouddueling.com 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();
          }
        }
      

      【讨论】:

      • 这似乎并没有强制从 S3 下载,而是您通过您的网络服务器将文件从 S3 推回,占用了您的网络服务器资源以强制下载。
      • @davidjbullock 不确定是不是,但这是一个糟糕的例子。我更新了我的示例以反映我做得更好的地方。
      【解决方案4】:

      在 s3 管理控制台窗口中,右键单击并选择属性。

      点击元数据。

      点击添加更多元数据

      关键:内容处置 值:附件

      保存。就是这样。

      这是一张图片http://i.imgur.com/2PWK3xF.jpg

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 2012-12-18
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        相关资源
        最近更新 更多