将Amazon AWS S3上的Mp3文件强制下载而不是流式传输

5
我正在使用Amazon S3上传mp3文件,然后允许我们的网站访问者从Amazon AWS下载mp3。我使用S3Fox来管理文件,一切似乎都运作良好,直到最近我们收到了很多来自访问者的投诉,说mp3通过浏览器流式传输而不是显示浏览器保存对话框。
我尝试了一些mp3,发现对于某些mp3,保存对话框框会出现,而对于其他一些mp3,则通过浏览器进行流式传输。我该怎么做才能强制下载mp3文件,而不是通过Web浏览器进行流式传输...
非常感谢您的任何帮助。 谢谢
4个回答

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

Content-disposition: attachment; filename=song.mp3

我不认为S3Fox可以实现这个功能。你可以使用Bucket Explorer(非免费软件)或编写脚本来上传文件。


嗯,那会是什么样的脚本呢?你可以用s3cmd (http://s3tools.org/s3cmd)来做到吗? - Jonik
我不确定s3cmd。请参考这篇论坛帖子http://developer.amazonwebservices.com/connect/thread.jspa?messageID=67395。您可以使用REST API来设置标头。亚马逊为许多语言(Ruby,Python,C#)提供库。您可以使用自己选择的语言编写脚本。 - kgiannakakis
谢谢您的回复,我正在使用 CloudBerry(免费软件)来设置内容头部。它工作得很好!非常感谢。 - Calua
谢谢@kgiannakakis,好的解决方案。我使用Cloudberry Explorer for S3设置了标题。 - Rowe Morehouse

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()); 

希望这可以帮助其他遇到相同困境的人。


2
这是我从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();
    }
  }

6
看起来这并不是从S3强制下载文件,相反,你是通过Web服务器将文件从S3推回,占用了Web服务器的资源来强制下载。 - davidjbullock
@davidjbullock 不确定是否如此,但那是一个糟糕的例子。我更新了我的示例以更好地反映我的做法。 - Michael J. Calkins

1
在s3管理控制台窗口中,右键单击并选择属性。
点击元数据。
点击添加更多元数据
键:content-disposition 值:attachment
保存。就这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接