2014-08-28 59 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);

相關問題