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

时间:2014-08-28 18:16:26

标签: php phpexcel

我有一个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错误:

  

&#34;我们发现$ filename中的某些内容存在问题。你想要我们吗?   试着尽可能多地恢复?如果您相信这个来源   工作簿,单击是。&#34;

点击&#34;是&#34;在excel错误导致修复&#39; xlsx文件打开并完全按照预期的方式查找。查看已完成的维修日志可以为我提供:

  

error129480_02.xmlErrors   在文件中检测到   &#39; C:\ XPATHX \ $ filename.xlsx&#39;的Excel   完成文件级验证和修复。这部分内容   工作簿可能已经修复或   丢弃。

......也就是说,没什么特别的。

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

我的问题是:可能导致此问题的原因和/或我该如何解决问题?

2 个答案:

答案 0 :(得分:4)

readfile回声。你不需要调用echo。

实际上,这样做会将readfile的结果(这是文件的大小作为整数)回显,因此在文件末尾会产生一些额外的字节。 Excel可以很容易地修复,并且可能不会导致实际数据丢失,但文件仍然无效,因此您会收到错误。

答案 1 :(得分:0)

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

由于此处的建议(https://phpexcel.codeplex.com/discussions/42854)和此处(PHPExcel File format or extension is not valid)已经从php文件中删除了所有其他echo命令,我知道某些内容必须添加信息。

我对上面的代码做了以下更改 - 在标头设置中取出文件名中的转义引号(只是个人猜测)并将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);