我正在使用Amazon S3放置mp3文件,然后允许我们的网站访问者从Amazon AWS下载mp3。我使用S3Fox来管理文件,一切看起来都很好,直到最近我们收到了很多来自访问者的投诉,即mp3是通过浏览器流式传输而不是显示浏览器保存对话框。 我尝试了一些mp3,并注意到对于某些mp3,会出现保存对话框,对于其他一些,它们会通过浏览器进行流式传输。我该怎么做才能强制下载mp3文件,而不是通过网络浏览器进行流式传输....
非常感谢任何帮助。 感谢
答案 0 :(得分:9)
为此,您需要设置Content-Disposition标头:
Content-disposition: attachment; filename=song.mp3
我认为S3Fox无法做到这一点。您可以使用Bucket Explorer(非免费)或编写脚本来上传文件。
答案 1 :(得分: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 :(得分: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();
}
}
答案 3 :(得分:1)