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解析,只是转发给浏览器。
解决方案:删除结束 ?>
标记或额外的新行。我通常更喜欢不使用?>
顺便说一句,我应该提到这一点:
$fp = fopen($tab_del_file, "r");
fpassthru($fp);
fclose($fp);
可以简化为
readfile($tab_del_file);
【讨论】:
也感谢 readfile 示例。我更改了代码,这也有效!【参考方案2】:您很可能在结束 ?>
之后有一个额外的空白行,它与数据一起回显。关闭 ?>
在 PHP 文件末尾始终是可选的。将其排除在外是防止此类问题的好习惯。
【讨论】:
我确实有一个 ?> 在最后。我删除了它,这已经解决了问题。这很有帮助。我学到了两件事。 ?> 是可选的,并且在执行 MIME 强制下载时,在最后一行代码之后的 PHP 代码中没有任何内容。谢谢!【参考方案3】:实际上这是由于 php 关闭标签的位置造成的问题。?>
。
基本上,PHP 文档上的 PHP 结束标记 ?>
对于 PHP 解析器来说是可选的。因此,如果在您的脚本中使用它并且您在?>
之后留下任何空格,那么它可能会导致不需要的错误或输出。我相信在你的情况下,你也会犯同样的错误。
因此,由于这个原因,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 类型会绕过错误并触发自动下载?