【问题标题】:How can I use php headers to download an external file without using bandwidth on my server?如何在不使用服务器带宽的情况下使用 php 标头下载外部文件?
【发布时间】:2011-12-18 09:26:31
【问题描述】:

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

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

?>

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

【问题讨论】:

  • 如果您从服务器设置标题,那么内容必须以相同的方式出现,因此它必须使用您的带宽
  • 正如您所怀疑的那样。 readfile() 调用会消耗您端的带宽,并且通过重定向将 HTTP 阅读器强加于外部资源是不可能的。除非您找到执行此操作(并提供带宽)的外部服务,否则这里没有解决方法。
  • sigh 我也是这么想的。谢谢大家。
  • 我能想到的都删了
  • 你可以自己回答;)

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


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

适用于下载 MP4 文件。

【讨论】:

  • 这是正确的答案。将流式下载传递给用户时,主服务器中几乎没有流量使用
【解决方案2】:

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

您要么需要通过您的服务器代理请求(不缓存会使带宽翻倍),要么与下载站点文件的所有者讨论支持您的要求。

【讨论】:

  • 谢谢。幸运的是,我碰巧与该网站的所有者有联系,所以我也许可以在这里真正完成一些事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多