服务器上有一个文件。该文件是ZIP文件。
该文件必须通过我的服务器下载到客户端。
我尝试使用readfile函数,但不是下载文件,而是只显示奇怪的符号......
我上传了它:http://b-games.co.il/test/download/
这是代码:
$file = "2title3.gif";
if(file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
我也试过用这个:
$url = 'http://example.com/some.url';
$src = fopen($url, 'r');
$dest = fopen('php://output', 'w');
$bytesCopied = stream_copy_to_stream($src, $dest);
但它做了同样的事情......只是显示了奇怪的符号。
我做错了什么? http://php.net/manual/en/function.readfile.php 这里说它应该有用......
重要更新:
在我的localhost上,相同的代码有效!
任何人都知道为什么?
谢谢!
答案 0 :(得分:3)
<?php
header('Content-disposition: attachment; filename=file.gif');
header('Content-type: image/gif');
readfile('file.gif');
您可以尝试这样的事情,注意设置正确的内容类型。
答案 1 :(得分:0)
已经工作 ..
<?php
session_start();
$a=$_GET['a'];
$parts=explode("-",$a);
$tres=$parts[0];
$nombre=$partes[1];
$dbcodletra=substr($tres,2);
if($dbcod!=$_SESSION["username"])$boolt=0;
if($ext==1) $extl=".jpg";
if($ext==2) $extl=".jpeg";
if($ext==3) $extl=".tif";
if($ext==4) $extl=".tiff";
if($ext==5) $extl=".pdf";
if($ext==6) $extl=".doc";
if($ext==7) $extl=".docx";
if($tipoproy==1) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==2) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==3) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==4) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if (file_exists($dir) && $boolt) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($dir));
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: ' . filesize($dir));
ob_clean();
flush();
readfile($dir);
exit;
}else echo "<meta http-equiv=\"Refresh\" content=\"0;url=misdocumentos.php\">";
?>
答案 2 :(得分:0)
这似乎是php-force-download-extension的重复。
“真正的”问题(恕我直言)是你已经生成了一个输出,并且你没有在代码的开头有ob_start(),所以ob_clean()什么都不做。
修改
这个你的PHP修改为下载只有GIF
<?php
ob_start();
// put some business here
$file = "2title3.gif";
if(file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
readfile($file);
exit;
}
编辑2
我看看你的示例代码,可能是我找到了你真正想做的事情。 试试这个example。
使用HTTP,您可以为每个请求发送仅一个 mime类型,因此您需要2个请求:一个用于HTML(显示示例),另一个用于下载(按提交按钮)。 / p>
答案 3 :(得分:0)
这似乎是您服务器上的问题。在虚拟服务器上打开PHP错误报告,并告诉我们它的含义。目前应该工作的一切工作。如果一切都失败了,可以试试JavaScript。