2012-03-19 56 views
2

我有一個查找在MySQL數據庫中的文件,發出一些頭,名字的文件的東西可讀的,然後腳本提供了它的用戶。PHP ReadFile的()無效拉鍊

這是工作半年左右(爲成千上萬的用戶),直到大約6小時前。 現在,Windows 7用戶現在得到一個錯誤,指出「Windows無法打開文件夾。壓縮(壓縮)文件夾:'... filename.zip'無效。」無論瀏覽器用於下載,都會發生這種情況Linux用戶等可以很好地打開交付的文件,Win7用戶也可以,比如WinRAR。只有Windows資源管理器無法打開它們。

這裏是它變得非常奇怪的地方...如果我製作了我的腳本的新副本,並刪除各種包括查找文件並決定如何命名它,它會下載並打開就好.. 。來自兩個腳本的結果文件大小相同,結果名稱相同。 [將新名稱硬編碼到原始腳本中並沒有幫助。我覺得這可能是一個編碼問題的名稱。]我已經嘗試過用不同的方法在不同的機器上創建不同內容的zip文件。

腳本檢查headers_sent(),file_exists(),和is_readable()。

apache_setenv('no-gzip', '1');加入以下唯一的半相關的信息,我可以在這裏找到或在互聯網上的其他地方的腳本(無效果)。

顯然,一些在包括以某種方式打破的東西,但我沒有任何想法要尋找什麼...想法? (包含大約300行代碼......基本上,它是數據庫訪問的抽象類,文件的所有類的具體版本以及它們的所有cms信息,該站點的相關圖像等)。

在一時興起,我在readfile($file);之前加上了「ob_clean(); ......它修正了它。所以我現在的問題是:爲什麼?所有文件中的錯誤報告都是關閉的。還有什麼可以發送輸出但不是頭文件?而爲什麼「突然」在behaivor

+0

您在一個包含的文件中有一些輸出。甚至可能是換行符或空格。 – Timur 2012-03-19 07:17:13

回答

3

主要問題

見過這個錯誤之前,把我的時間來識別問題,因爲有時它表示頭部已經發送,有時沒有。

這裏是我發現:

ob_clean作品時,你丟棄輸出緩衝區的內容,但如果你調用ob_clean之前使用ob_ get_ contents你將看到的內容造成錯誤

輸出這些信息確保您使用var_dump

一些其他錯誤

如果有space (" " or " \n" or "\t")調用?>標籤我經常收到錯誤只能由ob_clean

解決打開你的腳本找腳本,有空閒空間?>結束標記

結論後,多行後

我認爲這是在腳本中包括一個空的空間,你沒有看到,當你把它複製..你不是複製腳本,但不是空間,這就是爲什麼它的工作原理別處

+0

確實。在無效文件的開始處有一個額外的換行符。所有包含的文件在?> close標籤後都有一個額外的換行符......我將修復我的IDE的新php文件模板。 – BriAnna 2012-03-19 07:31:01

+0

很高興我能夠幫助:D ..嘗試使用Zend Studio或最新的Netbeans ..你會很容易看到這個錯誤 – Baba 2012-03-19 07:34:04

1

變化取出ob_clean();而在寫字板中打開損壞的文件或某些十六進制查看器的非二進制輸出的絲毫痕跡(包括空格,逗號。 E_NOTICEs,時期,灰塵,鳥糞等)將削弱 壓縮。

在最好的情況,你可能就發現一些E_NOTICES(警告:假設的「x」等不確定的常數X);如果不是,託管可能升級/改變了一些東西。

下一個犯罪嫌疑人就是那個名字,這個名字現在無法迴避。這是當你有http://url.com/download.php?file=xxx阿帕奇看到.php併發送text/php標題。我不記得那是什麼,但你用mod_rewrite修復它。

+0

是的,在破損文件的開頭處有一個額外的換行符。 – BriAnna 2012-03-19 07:30:18

0

像巴巴說,沒有空格(「」或「\ n」或「\ t」),我建議將php文件保存爲UTF8 而沒有BOM