2010-10-02 54 views
0

注意:我在本地主機上,所以CHMOD'ing不是答案。將提取的文件從ZIP複製到目錄


反正我不能去複製它從一個ZIP到一個目錄中提取的文件,這些文件被提取,但他們不會被複制......這些文件只是躺在根文件夾upload.php是。我有這個:

exec('unzip ' . $_FILES['file']['tmp_name'], $ary, $output); 

$img = 0; 

$number = count($ary); 

foreach($ary as $file) 
{ 
    copy($file, 'i/'); 
    unlink($file); 
    $img++; 
} 

echo $img . '/' . $number; 

它輸出11/11,這樣好...但文件不復制,原始文件不會被刪除。爲什麼不復制它們?

回答

2

問題是假設數組$ary中有文件名。但事實並非如此。

$ary其保持unzip命令的輸出將是這樣的:

extracting: foo 
extracting: bar 
... 

嘗試使用var_dump($ary)以確認此傾倒數組內容。

我的建議是不要使用外部unzip命令,而是使用build in zip functions of PHP爲:

$zip = new ZipArchive; 
if ($zip->open("$_FILES['file']['tmp_name']") === TRUE) { 
    $zip->extractTo('i/'); 
    $zip->close(); 
} else { 
    // failed to extract. 
} 
+0

對於一個好的答案+1,雖然可能應該注意ZipArchive是在PHP 4的後續版本中添加的。如果您在舊系統上,可能會被迫僅僅解析shell exec()行的輸出。 – stevendesu 2010-10-02 04:07:30

0

正如codaddict已經提到的,儘量PECL壓縮模塊,或梨File_Archive。 但是,如果你不能安裝任何這些,並繼續使用舊的PHP,嘗試:

exec('unzip ' . $_FILES['file']['tmp_name'] . ' | tail -n"+2" | cut -d" " -f4 ', $ary, $output); 

這應該給你只是文件名。

0

它不會複製文件beause你沒有完全閱讀手冊:

$ DEST - 目標路徑。如果$ dest是一個URL,如果包裝不支持覆蓋現有文件,複製操作可能會失敗。 警告:如果目標文件已經存在,它將被覆蓋。

您需要指定完整的目標路徑(包括文件名),而不僅僅是目錄。