2010-05-19 134 views
5

我使用亚马逊S3来放mp3文件,然后让我们的网站访问者从亚马逊AWS下载MP3。我使用S3Fox来管理文件,一切似乎都正常工作,直到最近我们收到很多来自访问者的抱怨,说mp3是通过浏览器流式传输的,而不是显示浏览器保存对话框。 我尝试了一些mp3,并注意到对于某些mp3,保存对话框出现,而对于其他一些则通过浏览器进行流式传输。我能做些什么来强制mp3文件将被下载,而不是通过网络浏览器进行流式传输....亚马逊AWS S3强制下载MP3文件而不是流它

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

回答

9

为了做到这一点,你需要设置Content-Disposition头:

Content-disposition: attachment; filename=song.mp3 

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

+0

嗯,那是什么样的脚本?你能用这样做吗? s3cmd(http://s3tools.org/s3cmd)? – Jonik 2010-05-19 16:54:26

+0

我不确定s3cmd。看到这个论坛帖子http://developer.amazonwebservices.com/connect/thread.jspa?messageID=67395。您可以使用REST API来设置标题。亚马逊为许多语言提供了库(Ruby,python,C#)。您可以使用您选择的语言编写脚本。 – kgiannakakis 2010-05-20 07:39:05

+0

感谢您的回复,我使用CloudBerry(免费软件)来设置内容标题。它工作正常!非常感谢 – Calua 2010-05-21 10:35:26

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文件格式下载,直到我停止返回读取文件并仅仅运行该功能。

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 [email protected] 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下载,而是通过您的网络服务器将文件从S3推回,捆绑您的web服务器资源以强制下载。 – davidjbullock 2013-06-19 16:11:29

+0

@davidjbullock不知道它是否是,但这是一个不好的例子。我更新了我的例子,以反映我做得更好。 – 2013-06-20 00:22:26

0

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

点击元数据。

单击添加更多的元数据

重点:内容处置 价值:附件

保存。就这样。

这是图像http://i.imgur.com/2PWK3xF.jpg