PHP文件下载在文件开始时添加了额外的空间


PHP file download adds extra spaces at begginning of file

我将文件存储在MySQL的LONGBLOB字段中。当我使用PHP检索文件时,它在文件的开头有一个额外的空间。我已经在MySQL Workbench查看器中检查了我的blob数据,额外的空间不在原始数据中。我下载的每个文件一开始都有一个额外的空间。$file['file']变量中不存在空格,我已将其写入日志并进行了检查。它被添加到PHP和浏览器之间切换的某个地方。

这是PHP:

<?php
    include("log.php");
    $log = new log;
    $dbserver='localhost';
    $dbid='xxxx';
    $dbpw='xxxx';
    $dbname='xxxx';
    $mydb=mysqli_connect($dbserver,$dbid,$dbpw);
    mysqli_set_charset($mydb,'utf8');
    mysqli_select_db($mydb, $dbname) or die($log->log("Unable to select database"));
    $q = "SELECT * FROM files WHERE id=$fileID";
    $r = mysqli_query($mydb, $q) or die ($log->log(mysqli_error($mydb) . $q));   
    $file = mysqli_fetch_array($r, MYSQLI_ASSOC);
    header("Content-Type: {$file['fileType']}");
    header("Content-Disposition: filename='"{$file['fileName']}'"", true);
    header("Content-Length: {$file['fileSize']}");
    echo trim($file['file']);
?>

我见过其他人用UTF-8编码在PHP页面或BOM上识别额外的空间,但我在我的页面上找不到这样的东西。我使用的是Notepad++和UTF-8,没有BOM。我还尝试通过终端使用vim在服务器上创建一个新文件,但没有更改。修剪也无济于事。我用Notepad++"显示所有字符",希望在某个地方找到额外的东西,而且我的文件中似乎没有任何额外的字符隐藏。PHP打开的carat是文件的第一个字符,关闭的carat则是文件的最后一个字符
还有什么?

谢谢,伯尔尼

很抱歉,问题出在我的日志类中,我没有向您展示。我删除了include,现在空的空间不见了。它在该文件中的PHP关闭标记后面有一个尾随空格。我感谢你的努力。谢谢伯尔尼

UTF8不使用BOM,因此您不应该添加BOM。然而,您正在添加带有换行符的头,如果您查看PHP的header()文档,则不应该这样做。

试着去掉末尾的结束标记("?>")。这个结束标记是不必要的,如果您在">"后面有一个换行符,那么该换行符将被发送到浏览器。

请参阅为什么要省略结束标记?有关PHP关闭标记的更多信息。