我正在尝试通过流媒体下载来通过我的服务器下载文件。
这是我的剧本:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=http://user:pass@example.com/file.bin';
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $r[2]);
ob_clean();
flush();
readfile($fileName);
exit;
example.com不是我真正使用的,我只是不想显示真实的URL。 :)当我在我的网络浏览器中访问此文件时,没有出现下载提示,也没有任何反应。 $r[2]
是文件的内容长度(以字节为单位),$fileName
与附件标头中使用的URL相同。我真的不知道我做错了什么。
答案 0 :(得分:5)
的ReadFile();需要机器上文件的绝对路径而不是网址。
e.g。 /home/person/file.exe
答案 1 :(得分:0)
文件名标题行末尾缺少)
,但我假设在编辑该行时发生了这种情况。
对于它的价值,运行示例代码会给出一个下载提示,在此之后还没有真正测试过,但也许它与服务器/客户端配置有关 - 而不是代码。
答案 2 :(得分:0)
恕我直言问题是文件大小,尝试通过http获取文件大小(看看这个函数): http://codesnippets.joyent.com/posts/show/1214
从
编辑header('Content-Length: ' . $r[2]);
到
header('Content-Length: ' . get_remote_file_size($fileurl) );
希望你解决问题。
答案 3 :(得分:0)
我找到了一种下载图像的方法,但这对任何类型的文件都有帮助。它在不使用readfile
的情况下下载文件。
我知道这可能很笨拙,但有时我们需要一些解决方法来完成工作。
试试这个,$src = 'http://external-server/remote-image.jpg'
$url_stuff = parse_url($src);
$port = isset($url_stuff['port']) ? $url_stuff['port'] : 80;
$fp = fsockopen($url_stuff['host'], $port);
$query = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n";
$query .= 'Host: ' . $url_stuff['host'];
$query .= "\n\n";
$buffer=null;
fwrite($fp, $query);
while ($tmp = fread($fp, 1024))
{
$buffer .= $tmp;
}
preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=your_file.bin');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
$content = substr($buffer, - $parts[1]);
echo $content;
这是经过测试和运作的; - )