php:强制下载来自不同的域名?

时间:2010-08-03 22:33:18

标签: php download

我想知道你们是否为我的问题提出了一些很棒的解决方案。正常的方式不起作用!

好吧,我正在尝试使用以下php脚本强制下载任何网站上的任何文件。我只是将?p = http://www.whatever.com/images/flowers/rose.jpg传递给我的网址并提示下载。

    <?php
    error_reporting(E_ALL);

    if(isset($_GET['p'])) $path = $_GET['p'];
    else echo "no path set!";

    $file = $path;
    //header('Location:' . $file); //works perfect, opens the file in the browser
    //
    header("Cache-Control: no-cache");
    header("Expires: -1");
    header("Content-Type: application/octet-stream;");
    header("Content-Disposition: attachment; filename=\"" . basename($file) . "\";");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . filesize($file));
    echo readfile($file);
    ?> 

但是,正如我今天发现的那样,filesize()只能在我的服务器上使用本地文件而不是http请求。这同样适用于readfile()

  

警告:filesize()[function.filesize]:stat失败   pathtofiles ... / downloader / d.php在线   15

     

警告:   ReadFile的(sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs211.snc4/...)   [function.readfile]:无法打开   stream:HTTP请求失败! HTTP / 1.0   403禁止进入   pathtofiles ... / downloader / d.php在线   16

我想知道是否有创意编码员可以帮助我。我有没有机会让这个剧本有效?我只想强制下载你传递的任何文件和网址。

谢谢你, 关于亚光

3 个答案:

答案 0 :(得分:0)

对于不受您控制的文件(作为远程文件),您无法“强制下载”。 'force-download'告诉浏览器下载即将传输的文件。 Location: some-path告诉浏览器查找新位置,从而收听新位置,而不是当前页面。

一个选项,但不是最佳选择,是制作文件的本地副本(在您的服务器上),然后将其检索给用户。如果文件足够大,这将给人一种冻结页面的印象。为避免这种情况,您可以读取远程文件的块,并在每个读取命令后传递。

请注意,您的代码不会限制$file可以下载的内容,因此允许用户在服务器上下载几乎任何可读文件,这是一个安全漏洞。

答案 1 :(得分:0)

如果您的PHP设置允许,

filesize()readfile()可以使用某些协议。

现在的问题是一个更基本的问题:

  

HTTP请求失败! HTTP / 1.0 403在pathtofiles中被禁止....

请记住,在使用PHP获取文件时,具有用户的登录权限。脚本instaince就像一个独立的浏览器。如果资源受密码保护,则需要首先登录PHP脚本。

答案 2 :(得分:0)

如果您可以控制远程文件,然后使用readfile函数,最好的方法是将文件大小存储在数据库中。

来自PHP手册

  

readfile()如果已启用fopen包装器,则可以使用URL作为此函数的文件名。