1

服务器上有一个文件。该文件是一个 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 这里说它应该可以工作......

一个重要更新:

在我的本地主机上,相同的代码有效!

有谁知道为什么?

谢谢!

4

4 回答 4

3
<?php 
header('Content-disposition: attachment; filename=file.gif');
header('Content-type: image/gif');
readfile('file.gif');

您可以尝试这样的事情,注意设置正确的内容类型。

于 2012-06-29T13:08:04.077 回答
0

这似乎是您的服务器上的问题。在您的虚拟服务器上打开您的 PHP 错误报告并告诉我们它的内容。目前,一切都应该正常工作。如果一切都失败了,可以试试 JavaScript。

于 2012-06-29T13:56:09.437 回答
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

于 2012-06-29T13:14:01.370 回答
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

我看看你的示例代码,可能是我找到了你真正想做的事情。试试看这个例子

使用 HTTP,每个请求只能发送一种mime 类型,因此您需要 2 个请求:一个用于 HTML(显示示例),一个用于下载(按提交按钮)。

于 2012-06-29T13:17:46.077 回答