PHP:为啥强制 mime 下载会添加 2 个额外的空行?

Posted

技术标签:

【中文标题】PHP:为啥强制 mime 下载会添加 2 个额外的空行?【英文标题】:PHP: Why is this forced mime download adding 2 extra empty lines?PHP:为什么强制 mime 下载会添加 2 个额外的空行? 【发布时间】:2013-04-28 16:04:26 【问题描述】:

我编写了一个 php 脚本来创建一个 .txt 制表符分隔文件。我需要将此强制下载到网络浏览器。它完成了所有这些,但是当我将文件与强制下载的源进行比较时,它包含两个额外的空白行。代码如下:

// Force download of the tab del .txt file to the web browser:

    header('Content-Type: application/download');
    header("Content-Disposition: attachment; filename=$tab_del_file");
    header("Content-Length: " . filesize($tab_del_file));

    $fp = fopen($tab_del_file, "r");
    fpassthru($fp);
    fclose($fp);

Linux Shell 命令比较两个文件并显示有多余的空行: $ diff example.txt /tmp/example.txt 25a26,27

我将下载的 example.txt sftp'ed 到 /tmp 目录,这样我就可以在服务器上进行比较。为什么在下载的版本中添加了两个空白行,修复方法是什么?谢谢!

【问题讨论】:

您的 php 文件中有关闭 ?> 标记吗? 我不是 PHP 专家,但我认为 $ diff example.txt tmp/example.txt 25a26,27 > > 语法错误 @Edward 检查我的答案 ;) @hek2mgl。谢谢!我以为你在问,因为如果我没有 ?> 它可能会导致问题。但我现在明白了,这是造成这个问题的真正原因。 @AlexRuhl 那不是 PHP。这就是diff 命令。 OP 用它来证明输出中有两个额外的新行。 【参考方案1】:

由于 php 代码本身看起来不错并且不会产生新的行,这可能只有一个原因。您的文件末尾有一个结束 ?> 标记和额外的新行:

?>
<--- empty line
<--- empty line

注意php标签外的内容不会被PHP解析,只是转发给浏览器。

解决方案:删除结束 ?&gt; 标记或额外的新行。我通常更喜欢不使用?&gt;


顺便说一句,我应该提到这一点:

$fp = fopen($tab_del_file, "r");
fpassthru($fp);
fclose($fp);

可以简化为

readfile($tab_del_file);

【讨论】:

也感谢 readfile 示例。我更改了代码,这也有效!【参考方案2】:

您很可能在结束 ?&gt; 之后有一个额外的空白行,它与数据一起回显。关闭 ?&gt; 在 PHP 文件末尾始终是可选的。将其排除在外是防止此类问题的好习惯。

【讨论】:

我确实有一个 ?> 在最后。我删除了它,这已经解决了问题。这很有帮助。我学到了两件事。 ?> 是可选的,并且在执行 MIME 强制下载时,在最后一行代码之后的 PHP 代码中没有任何内容。谢谢!【参考方案3】:

实际上这是由于 php 关闭标签的位置造成的问题。?&gt;

基本上,PHP 文档上的 PHP 结束标记 ?&gt; 对于 PHP 解析器来说是可选的。因此,如果在您的脚本中使用它并且您在?&gt; 之后留下任何空格,那么它可能会导致不需要的错误或输出。我相信在你的情况下,你也会犯同样的错误。

因此,由于这个原因,PHP 脚本应该省略结束标记,而应该使用注释块来标记脚本的结尾。

这是一个小例子:

不正确:

<?php

echo "Hello World!";

?>

正确:

<?php

echo "Hello World!";

/* End of file myfile.php */
/* Location: ./system/modules/mymodule/myfile.php */ 

我希望这对你有帮助..!!

【讨论】:

谢谢!这也很有帮助!

以上是关于PHP:为啥强制 mime 下载会添加 2 个额外的空行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥某些无效的 MIME 类型会触发“TypeError”,而其他无效的 MIME 类型会绕过错误并触发自动下载?

[php]强制下载文件

将静态图像添加到 php 邮件系统时,为啥会出现“意外 CID”错误?

sharepoint 2013 在线 mime

IIS 时常不让下载文件,为啥?

如何使用 PHP 在移动设备上强制下载音频 mp3