簡體   English   中英

PHP readfile()無效的zip

[英]PHP readfile() invalid zip

我有一個腳本在mysql數據庫中查找文件,發送一些標題,將文件命名為人類可讀的,然后將其傳遞給用戶。

它工作了大約六個月(成千上萬的用戶),直到大約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();它修復了它。所以現在我的問題是:為什么?所有文件中的錯誤報告都已關閉。還有什么可以發送輸出但不是標題?為什么行為的“突然”改變?

重大問題

之前已經看過這個錯誤,並花了我時間來確定問題,因為有時它會說已經發送了Header,有時卻沒有。

這是我發現的:

ob_clean在丟棄輸出緩沖區的內容時起作用,但如果在調用ob_clean之前使用ob_ get_ contents ,則會看到導致錯誤的內容

要輸出此信息,請確保使用var_dump

其他一些錯誤

如果在調用?>標簽后有space (" " or " \\n" or "\\t") ,我經常會遇到只能通過ob_clean解決的ob_clean

打開腳本查找在?> close標記后面有更多空行空間的腳本

結論

我認為你的腳本中有一個空的空間,你沒有看到,當你復制它時......你不是在復制腳本而是復制空間,這就是為什么它在其他地方工作的原因

取出ob_clean(); 並在Wordpad或一些十六進制查看器中打開一個損壞的文件。 最輕微的非二進制輸出(包括空格,逗號,E_NOTICE,句號,灰塵,鳥糞等)將破壞ZIP。

充其量你可能只會發現一些E_NOTICES(警告:未定義常量x假定'x'等); 如果沒有,托管可能升級/改變了一些東西。

下一個嫌疑人就是那個名字現在不能包括我的東西。 這時你有http://url.com/download.php?file=xxx Apache看到.php並發送text/php標題。 我不記得那是什么,但你用mod_rewrite修復它。

就像Baba說的那樣,沒有空格(“”或“\\ n”或“\\ t”),我建議在沒有BOM的情況下以UTF8保存php文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM