2015-09-21 91 views
1

我在這裏拉我的頭髮。我花了上個星期試圖弄清楚爲什麼ZipArchive extractTo方法在Linux上的行爲與在我們的測試服務器(WAMP)上的行爲不同。Linux PHP ExtractTo返回整個路徑而不是文件結構

下面是該問題的最基本的例子。我只是需要提取具有以下結構的拉鍊:

my-zip-file.zip 
-username01 
    --filename01.txt 
    -images.zip 
     --image01.png 
    -songs.zip 
     --song01.wav 
-username02 
    --filename01.txt 
    -images.zip 
     --image01.png 
    -songs.zip 
     --song01.wav 

下面的代碼將提取根zip文件,並保持結構我WAMP的服務器上。我不需要擔心提取子文件夾。

<?php 
if(isset($_FILES["zip_file"]["name"])) { 
$filename = $_FILES["zip_file"]["name"]; 
$source = $_FILES["zip_file"]["tmp_name"]; 
$errors = array(); 

$name = explode(".", $filename); 

$continue = strtolower($name[1]) == 'zip' ? true : false; 
if(!$continue) { 
    $errors[] = "The file you are trying to upload is not a .zip file. Please try again."; 
} 

$zip = new ZipArchive(); 

if($zip->open($source) === FALSE) 
{ 
    $errors[]= "Failed to open zip file."; 
} 

if(empty($errors)) 
{ 
    $zip->extractTo("./uploads"); 
    $zip->close(); 
    $errors[] = "Zip file successfully extracted! <br />"; 
} 

} 
?> 

從上面的WAMP腳本輸出正確提取它(保持文件結構)。

當我我們生活的服務器上運行這個輸出是這樣的:

--username01\filename01.txt 
--username01\images.zip 
--username01\songs.zip 
--username02\filename01.txt 
--username02\images.zip 
--username02\songs.zip 

我想不通爲什麼它的行爲不同的活的服務器上。任何幫助將不勝感激!

+0

嘿@Zachary。我不清楚究竟是什麼問題。你想在兩個系統中遞歸提取zip嗎? –

+0

感謝您的回覆!問題是,當我解壓zip文件時,linux破壞了文件結構.....我相信它與反斜槓有關,但我無法弄清楚如何使用正斜槓來保留目錄結構 – Zachary

+0

我認爲我遇到了這個問題:斜槓成爲Linux上文件名的一部分。是嗎? –

回答

0

要修復文件路徑,您可以遍歷所有提取的文件並將其移動。

你的循環中假設了你有一個包含文件路徑的變量$source提取的所有文件(例如:username01\filename01.txt),你可以做到以下幾點:

// Get a string with the correct file path 
$target = str_replace('\\', '/', $source); 

// Create the directory structure to hold the new file 
$dir = dirname($target); 
if (!is_dir($dir)) { 
    mkdir($dir, 0777, true); 
} 

// Move the file to the correct path. 
rename($source, $target); 

編輯

您應該檢查了在執行上述邏輯之前,在文件名中使用反斜槓。用迭代器,你的代碼應該看起來像這樣:

// Assuming the same directory in your code sample. 
$dir = new DirectoryIterator('./uploads'); 
foreach ($dir as $fileinfo) { 
    if (
     $fileinfo->isFile() 
     && strpos($fileinfo->getFilename(), '\\') !== false // Checking for a backslash 
    ) { 
     $source = $fileinfo->getPathname(); 

     // Do the magic, A.K.A. paste the code above 

    } 
} 
+0

仍然做同樣的事情。我不認爲mkdir函數和重命名函數做了什麼。我會發布我的代碼,但它不適合評論。 – Zachary

+0

@Zachary,你可以添加你試過的代碼來更新你的問題。 –

+0

我可以得到您的電子郵件地址嗎?上面的代碼比實際代碼更概念化。我想向您發送實際的代碼。 – Zachary

相關問題