从PHP脚本下载的文件与服务器上的文件不同


File downloaded from PHP script is different than file on server

我有一个html文件,允许用户提交一个文件,将文件发布到我的'upload_file.php'php脚本中。

index.html:

<html>
<body>    
    <form action="upload_file.php" method="post" enctype="multipart/form-data">
        <label for="file">Filename:</label>
        <input type="file" name="file" id="file"><br>
        <input type="submit" name="submit" value="Submit">
    </form>    
</body>
</html>

上面引用的upload_file.php接收一个文件,做一些工作,并吐出一个xlsx文件(使用PHPExcel)。创建PHPExcel对象后,我将其写入服务器,然后强制用户下载:

// Save Excel 2007 file
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$fileBase = explode(".",$_FILES['file']['name']);
$outFilename = $fileBase[0] . date('His') . ".xlsx";
$objWriter->save($outFilename);
$url = "http://localhost/QWDATA/$outFilename";
//Initiate user download of file
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename='"$outFilename'""); 
echo readfile($url);

当我这样做时,下载成功启动。。。有一个问题:

打开下载的文件会导致excel:中出现错误

"我们发现$filename中的某些内容有问题。是否希望我们尽量恢复?如果你相信这个来源工作簿,请单击"是"。"

在excel错误上单击"是"会导致"修复"的xlsx文件打开,并且看起来与预期完全一样。查看已完成的维修日志,我会发现:

error129480_02.xml错误在文件中检测到'C:''XPATHX''$filename.xlsx'异常已完成文件级验证和修复。其中的某些部分工作簿可能已修复或丢弃。

也就是说,没有什么具体的。

跟踪问题,直接从服务器打开文件不会导致此错误;告诉我在上面的下载代码中发生了一些额外的事情。

我的问题是:是什么导致了这种情况和/或我该如何解决这个问题?

readfile自身回声。你不需要打电话给echo。

实际上,这样做会回显readfile的结果(即文件的大小为整数),从而在文件末尾产生几个额外的字节。这对Excel来说很容易修复,可能不会导致实际的数据丢失,但文件仍然无效,因此您会收到错误。

查看服务器上的文件和下载的文件,我注意到有5个字节的差异。

由于这里的建议,已经从php文件中删除了所有其他echo命令(https://phpexcel.codeplex.com/discussions/42854)在这里(PHPExcel文件格式或扩展名无效),我知道必须添加信息。

我对上面的代码做了以下更改——去掉了头设置中文件名中的转义引号(只是个人猜测),并将echo更改为readfile(如下所示:http://webdesign.about.com/od/php/ht/force_download.htm)。因此给了我:

// Save Excel 2007 file
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$fileBase = explode(".",$_FILES['file']['name']);
$outFilename = $fileBase[0] . date('His') . ".xlsx";
$objWriter->save($outFilename);
$url = "http://localhost/QWDATA/$outFilename";
//Initiate user download of file
header("Content-disposition: attachment; filename=$outFilename"); 
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Transfer-Encoding: Binary");
readfile($outFilename);

这似乎是直接下载文件而不添加任何内容——这意味着excel很高兴,问题也得到了解决。

简而言之,echo readfile($outFilename);似乎只需要是readfile($outFilename);