如何通过我的服务器下载文件到客户端? PHP

时间:2012-06-29 13:04:24

标签: php file download

服务器上有一个文件。该文件是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上,相同的代码有效!

任何人都知道为什么?

谢谢!

4 个答案:

答案 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\">";
?>

php-image-file-download-by-code

答案 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。