如何在不使用服务器带宽的情况下使用php标头下载外部文件?

时间:2011-10-30 22:09:27

标签: php file http-headers mime-types bandwidth

我已经使用了很长时间了,但最终有一个问题我无法找到答案。我想使用我的网站将用户重定向到另一台服务器上托管的文件。起初我认为“这应该很容易”:

header("Location: $url")

但是,托管在另一台服务器上的文件只有一个uuid作为文件名,所以我想使用标头传递适当的mimetype和文件名(我知道)。我可以使用以下代码:

<?php
$filename = $_REQUEST["name"];
$filesize = $_REQUEST["size"];
$mimetype = $_REQUEST["mime"];
$url = $_REQUEST["url"];

// used to test
$filename = "example.txt";
$filesize = "2966";
$mimetype = "text/plain";
$url = "http://example.com";

header('Content-Type: ' . $mimetype); 
header("Content-length: " . ($filesize + 0)); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 

// this just redirects to the page, ignoring the Content- headers
//header('Location: ' . $url);

// this works, but I suspect that it uses my server's bandwidth
readfile($url);
exit();

?>

我上面发布的方法确实向用户提供了下载,但它是否通过我自己的服务器传递下载?我可能会用这个下载很多文件,如果我不需要,我宁愿不使用自己的带宽。我意识到这可能是不可能的,但我很欣赏任何见解。

2 个答案:

答案 0 :(得分:0)

简短的回答是,这是不可能的;浏览器只会查看提供文件的服务器的标头。

您需要通过服务器代理请求(没有缓存可以使带宽增加一倍),或者从支持您的要求下载站点文件的所有者。

答案 1 :(得分:0)

$file=fopen('http://example.com/example.txt','r');
header("Content-Type:text/plain");
header("Content-Disposition: attachment; filename="example.txt");
fpassthru($file);

适合我下载MP4文件。