2011-10-10 87 views
2

我不是原生的PHP開發人員,但我會盡我所能找到並一起破解,所以請原諒,如果這不會造成太多感覺:創建一個ZIP文件腳本不會創建ZIP(無錯誤)

我有一個簡單的(看來)腳本,在URL中有兩個參數。一個是簡單的字符串(要創建的ZIP的標題),另一個是序列化的音頻軌道陣列,指向需要壓縮的服務器上的文件。這些話通就好了,並反序列化等,這裏的腳本:

<?php 

$audioTitleVar = unserialize(rawurldecode($_GET['audioTitle'])); 
$audioArrayVar = unserialize(rawurldecode($_GET['audioArray'])); 

function create_zip($files = array(), $destination = '', $overwrite = true) { 

    if(file_exists($destination) && !$overwrite) { return false; } 

    $valid_files = array(); 

    if(is_array($files)) { 
     foreach($files as $file) { 
      if(file_exists($_SERVER['DOCUMENT_ROOT'] . str_replace("http://mydomain.com","", $file))) { 
       $valid_files[] = $_SERVER['DOCUMENT_ROOT'] . str_replace("http://mydomain.com","", $file); 
      } 
     } 
    } 

    if(count($valid_files)) { 

     $zip = new ZipArchive(); 

     if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
      return false; 
     } 

     foreach($valid_files as $file) { 
      $just_name = preg_replace("/(.*)\/?([^\/]+)/","$2",$file); 
      $zip->addFile($file,$just_name); 
      //$zip->addFile($file,$file); 
     } 

     //echo '<p>The zip archive contains ' . $zip->numFiles . ' files with a status of ' . $zip->status . '</p>';   
     $zip->close(); 
     return file_exists($destination); 

    } else { 
     return false; 
    } 

} 

$fileName = $_SERVER['DOCUMENT_ROOT'] . '/wp-content/themes/jones/zip/' . $audioTitleVar . '.zip'; 
create_zip($audioArrayVar, $fileName, true); 
//echo '<p>File Path: ' . $fileName . '</p>'; 
var_dump(file_exists($fileName)); 

?> 

我在這裏想我真正的問題是,雖然該腳本沒有錯誤...沒有ZIP創建。隨着時間的推移,我將某些部分的輸出放在函數中,看看它是否到達那裏,而且它是 - 所以我難以忍受這一點。

我真的需要的是你們中的一個人掃描腳本,看看有沒有什麼明顯的東西顯示不出來!

難道這是一個權限的事情? PHP應該運行在CGI模式還是Apache?或者這沒有什麼區別?

該腳本的骨骼取材於:http://davidwalsh.name/create-zip-php,但即使僅使用該版本,它也從未運行過。

PS - 我只想補充一點,如果我取消註釋告訴我在ZIP等文件中有多少文件的行,它似乎會返回正確的信息......但最終檢查文件存在返回false。

+0

你的腳本是可怕的不安全。抓住我們想要的任何文件(嗯,Web服務器可以訪問)並將其壓縮起來很容易。你會得到什麼錯誤?錯誤報告是?你是否已經加入了一些調試'echo'語句來確保你的代碼在應該被執行的地方執行? – Brad

+0

嗨布拉德,是的,它可能是非常不安全的,但我只是需要得到它現在的工作,並會在稍後嘗試收緊它。在報告IS時出錯。如果我寫一些廢話,我會發現錯誤很好。回聲(你看到評論)確實輸出很好。即使是告訴我在檔案中有多少個文件的行!奇怪的。謝謝你快速的回覆。 –

+0

這可能會簡化它,但是你檢查了文件夾的權限嗎? – Ash

回答

3

好吧,我終於搞定了。

似乎addFile()中有東西損壞了代碼。

我改變了這個:

foreach($valid_files as $file) { 
      $just_name = preg_replace("/(.*)\/?([^\/]+)/","$2",$file); 
      $zip->addFile($file,$just_name); 
      //$zip->addFile($file,$file); 
     } 

要這樣:

foreach($valid_files as $file) { 
      // Use basename to get JUST the file name from the path. 
      $zip->addFile($file, basename($file)); 
     } 

的基本部分功能僅獲取文件名,然後放置在ZIP。在它是服務器上的整個路徑之前,這導致Windows扼殺它。

希望這可以幫助別人有一天。

+1

你現在可以接受你自己的答案:) –