2014-08-28 63 views
0

我有一个html文件,它允许用户提交文件以将文件发布到我的'upload_file.php'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上面引用需要在一个文件中,做了一些工作,并吐出(使用PHPExcel)一个XLSX文件。创建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下载导致一个错误的文件:

“我们发现,在$文件名部分内容的问题,你想我们 尝试恢复尽可能多的,我们可以。如果你信任?此 工作簿的来源,请单击是。“

在excel错误上单击“yes”会导致“修复”的xlsx文件打开,看起来完全如人们所期望的那样。看着一个日志中这样做了修理的给了我这样的:\ XPATHX \ $ filename.xlsx'Excel 完成文件级验证和修复:

error129480_02.xmlErrors 文件 “C进行检测。此 工作簿的某些部分可能已被修复或丢弃了 。

......这就是说,没有什么特定的。

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

我的问题是:什么可能导致这个和/或我该如何解决问题?

回答

4

readfile本身的回声。您不需要调用回显。

实际上,这样做会将readfile的结果(文件的大小作为整数)进行回显,以便在文件末尾引起一些额外的字节。这对于Excel来说很容易修复,并且可能不会导致实际的数据丢失,但该文件仍然无效,因此会出现错误。

0

看着服务器上的文件和下载的文件,我发现有5个字节的差异。

在已经移除了PHP文件中的所有其他echo命令由于这里建议(https://phpexcel.codeplex.com/discussions/42854)和这里(PHPExcel File format or extension is not valid)我知道东西必须添加信息。

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

相关问题