我有一个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 完成文件级验证和修复。这部分内容 工作簿可能已经修复或 丢弃。
......也就是说,没什么特别的。
追溯问题,直接从服务器打开文件不会导致此错误;在上面的下载代码中告诉我一些额外的事情。
我的问题是:可能导致此问题的原因和/或我该如何解决问题?
答案 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);