PHP Force下载远程文件

时间:2009-10-03 19:28:56

标签: php download amazon-s3

我的Amazon S3存储空间存储了大量视频。我正在创建一个PHP脚本,非常类似于here,用户可以将视频下载到硬盘上。

我想使用这样的东西:

<?php
$file_name = $_GET['file'];
$file_url = 'http://www.myamazons3.com/' . $file_name;
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url);
exit;

但是,我认为这会增加带宽,因为视频将通过我的服务器传输。

关于如何强制下载这些视频的任何想法,同时避免首先通过我自己的服务器阅读它?

非常感谢!

4 个答案:

答案 0 :(得分:2)

查看S3 API文档,并记下您可以设置的标头值。亚马逊将在请求文件时发送这些文件:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html(可以通过POST发送相同的参数来更新现有对象)

答案 1 :(得分:1)

您提到的PHP脚本可以正常工作,但主要的缺点是,每当您网站上的访问者请求文件时,您自己的服务器将从S3加载它,然后将该数据中继到浏览器。对于低流量站点,这可能不是什么大问题,但对于高流量站点,您肯定希望避免通过自己的服务器运行所有内容。

幸运的是,有一种非常直接的方法可以将文件设置为强制从S3下载。您只想设置内容类型和内容处理(只是设置内容处理在某些浏览器中可以使用,但设置两者都适用于所有浏览器)。

此代码假设您使用的是Undesigned中的Amazon S3 PHP类:

 “application / octet-stream”,“Content-Disposition”=&gt; “附件”)); ?&GT;

现在您的所有文件都将被强制下载。您可能需要清除缓存以查看更改。显然,不要在你真正希望在浏览器中“内联”加载的任何文件上这样做。

这个解决方案很好的部分是直接加载媒体文件的应用程序(比如让我们说Flash中的mp3播放器)不关心内容类型或内容处理,所以你仍然可以在浏览器然后链接下载同一个文件。如果用户已经完成了在闪存中加载文件,他们很可能仍然会在缓存中使用它,这意味着他们的下载速度非常快,甚至不会从S3中花费额外的带宽费用。

答案 2 :(得分:0)

header('Location: ' . $file_url);

答案 3 :(得分:0)

我知道这是一个旧线程,但在过去的一年里,S3团队增加了对request parameters的支持,允许您根据请求覆盖某些HTTP头。

例如,您可以将SVG图像上传为image/svg+xml,但在检索application/octet-stream时会覆盖标题以强制下载。

使用AWS SDK for PHP,您可以使用Aws\S3\S3Client::createPresignedUrl()方法来实现此目标。