PHP输出文件在磁盘上到浏览器

时间:2010-01-08 16:12:35

标签: php

我想在PHP中向浏览器提供现有文件。 我见过关于image / jpeg的例子,但是这个函数似乎将文件保存到磁盘,你必须先创建一个合适大小的图像对象(或者我只是不理解它)。)

在asp.net中,我通过读取字节数组中的文件然后调用context.Response.BinaryWrite(bytearray)来做到这一点,所以我在PHP中寻找类似的东西。

米歇尔

6 个答案:

答案 0 :(得分:29)

fpassthru() 可以完全满足您的需求。请参阅手册条目以阅读以下示例:

<?php

// open the file in a binary mode
$name = './img/ok.png';
$fp = fopen($name, 'rb');

// send the right headers
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

// dump the picture and stop the script
fpassthru($fp);
exit;

?>

有关PHP的所有文件系统函数,请参阅here

如果它是您要提供下载的二进制文件,您可能还希望发送正确的标题,以便弹出“另存为...”对话框。请参阅this question的第一个答案,以获取有关要发送的标头的一个很好的示例。

答案 1 :(得分:11)

我用这个

  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, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));

        ob_clean();
        flush();
        readfile($file);
        exit;

    } 

答案 2 :(得分:3)

我使用readfile()(http://www.php.net/readfile)...

但您必须确保使用header()设置正确的“Content-Type”,以便浏览器知道如何处理该文件。

你也可以强制浏览器下载文件,而不是试图使用插件来显示它(比如PDF),我总觉得这看起来有点“hacky”,但是在上面解释了链接。

答案 3 :(得分:2)

这应该让你开始: http://de.php.net/manual/en/function.readfile.php

编辑:如果您的网络服务器支持,请使用

header('X-Sendfile: ' . $filename);

其中文件名包含本地路径,如

/var/www/www.example.org/downloads/example.zip

比readfile()快。

(使用header()的常见安全注意事项)

答案 4 :(得分:1)

对于我为客户创建的网站和网站,我使用的是很久以前发现的PHP脚本。

可在此处找到:http://www.zubrag.com/scripts/download.php

我使用了稍微修改过的版本,允许我对文件系统结构进行模糊处理(默认情况下),除了不允许热链接(默认)之外,我还添加了一些额外的跟踪功能,例如引用,IP (默认),以及我可能需要的其他此类数据。

希望这会有所帮助。

答案 5 :(得分:0)

以下将启动XML文件输出

$fp = fopen($file_name, 'rb');

// Set the header
header("Content-Type: text/xml");
header("Content-Length: " . filesize($file_name));
header('Content-Disposition: attachment; filename="'.$file_name.'"');

fpassthru($fp);
exit;

“内容处置:附件” 很常见,并且被Facebook之类的网站用来设置正确的标题