2009-08-23 55 views
2

在一個腳本,我需要做到以下幾點:PHP:如何處理單個腳本中的文件處理和下載操作?

  1. 創建一個ZIP出文件的目錄中
  2. 力新創建的壓縮的下載

我的問題是,每當我嘗試在單個腳本中執行此操作時,下載的zip文件已損壞(雖然文件大小不錯)。如果我在兩個獨立的腳本調用中觸發 進程,則下載的zip文件可以正常使用。

我想問題是壓縮保存到文件進程並不完全是 在下載開始之前完成。奇怪的是,它並沒有解決問題 之間插入睡眠(3)...下面的代碼大綱。

如何確保zip文件在強制下載開始之前完全完成?

祺/喬納斯

// 1. create a zip 
$createZipFile = new CreateZipFile('temp.zip'); 
$createZipFile->zipDirectory('temp/', '.'); 
$createZipFile->saveZipFile(); 

sleep(3); // <-- Doesn't matter! 

// 2. force zip download 
$fileServer = new FileServer(); 
// Line below gives a corrupted zip when run in same script as 1.  
$fileServer->forzeDownload('temp.zip'); 
+2

嘗試在文本編輯器中打開損壞的zip文件 - 它可能會揭示出現問題的地方。有可能它只包含一個404頁(顯然這不是一個格式正確的zip文件)。 – JorenB 2009-08-23 10:43:27

+0

您可能會有一些額外的輸出(可能是PHP塊之前的單個空格/換行符),這會損壞您的數據。 – Gumbo 2009-08-23 10:46:19

回答

0

謝謝JorenB和濃湯! texteditor檢查發現一些調試輸出在zip創建中,不會影響標準zip,但是會在下載時破壞發送到瀏覽器的數據。

1

創建ZIP,然後將用戶重定向到該文件。

http://php.net/manual/en/function.header.php

+0

謝謝安東尼奧,但在這種情況下,我必須在一個過程中做到這一點...... – Cambiata 2009-08-23 10:55:26

+0

你正在一個過程中做到這一點。您已經創建了該文件,只需使用標題來傳遞適當的標題即可下載文件,然後使用readfile。或者簡單地將用戶重定向到zip文件(這簡單得多) – AntonioCS 2009-08-23 20:27:30

+0

如果你這樣做,那麼不要忘記實施某種解決方案,刪除已經提供服務的文件。 – 2009-08-24 14:20:42