我想知道你们是否为我的问题提出了一些很棒的解决方案。正常的方式不起作用!
好吧,我正在尝试使用以下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
我想知道是否有创意编码员可以帮助我。我有没有机会让这个剧本有效?我只想强制下载你传递的任何文件和网址。
谢谢你, 关于亚光答案 0 :(得分:0)
对于不受您控制的文件(作为远程文件),您无法“强制下载”。 'force-download'告诉浏览器下载即将传输的文件。 Location: some-path
告诉浏览器查找新位置,从而收听新位置,而不是当前页面。
一个选项,但不是最佳选择,是制作文件的本地副本(在您的服务器上),然后将其检索给用户。如果文件足够大,这将给人一种冻结页面的印象。为避免这种情况,您可以读取远程文件的块,并在每个读取命令后传递。
请注意,您的代码不会限制$file
可以下载的内容,因此允许用户在服务器上下载几乎任何可读文件,这是一个安全漏洞。
答案 1 :(得分:0)
filesize()
和readfile()
可以使用某些协议。
现在的问题是一个更基本的问题:
HTTP请求失败! HTTP / 1.0 403在pathtofiles中被禁止....
请记住,在使用PHP获取文件时,不具有用户的登录权限。脚本instaince就像一个独立的浏览器。如果资源受密码保护,则需要首先登录PHP脚本。
答案 2 :(得分:0)
如果您可以控制远程文件,然后使用readfile函数,最好的方法是将文件大小存储在数据库中。
来自PHP手册
readfile()如果已启用fopen包装器,则可以使用URL作为此函数的文件名。