2017-06-02 91 views
0

我想提取一個文件zip到一個使用PHP的代碼之前創建的目錄,但它不起作用。我認爲這是一個權限問題,因爲如果我手動創建該文件夾,它會工作,如果從我的腳本創建它,instad它不起作用!如何將文件壓縮文件解壓縮到之前由代碼(PHP)創建的目錄中?

.... 
$filename = $_FILES["userfile"]["name"]; 
$source = $_FILES["userfile"]["tmp_name"]; 
$name = explode(".", $filename); 
$target_path = "Apps\\" . $username . "\\" . $name[0]; 

if(move_uploaded_file($source, $target_path)) 
{  
    $zip = new ZipArchive(); 
    $x = $zip->open($target_path); 
    if ($x === true) 
    { 
     $zip->extractTo("Apps\\".$username); <- ERROR ON THIS LINE 
     $zip->close(); 
    } 
.... 

這是錯誤:(警告:ZipArchive :: extractTo():沒有這樣的文件或目錄)

我該如何解決呢?

謝謝!

+0

檢查你想要提取的文件路徑 –

+0

http://php.net/manual/en/ziparchive.extractto.php –

+1

我的猜測是ziparchive需要一個完整路徑。如果打開工作路徑應該存在。但是,您正在使用相對路徑。嘗試類似'__DIR __。「Apps \\」。$ username' –

回答

0

我解決它做到這一點:

$filename = $_FILES["userfile"]["name"]; 
$source = $_FILES["userfile"]["tmp_name"]; 

$name = explode(".", $filename); 
$target_path = "Apps/" . $username . "/" . $name[0]. "." .$name[1];  

if(move_uploaded_file($source, $target_path)) 
{  
    $zip = new ZipArchive(); 
    $x = $zip->open($target_path); 
    if ($x === true) 
    { 
     $zip->extractTo("Apps/" . $username . "/"); 
     $zip->close(); 
    } 
} 

這是$ target_path的問題,因爲它需要擴展($名[1 ])

謝謝大家!

0

這是你的路徑問題,所以更新你的路徑,然後它將完美工作,這是演示代碼,它可以幫助你上傳zip文件,並將zip文件解壓縮到zip文件夾的同一個文件中。

<?php 
function rmdir_recursive($dir) { 
    foreach(scandir($dir) as $file) { 
     if ('.' === $file || '..' === $file) continue; 
     if (is_dir("$dir/$file")) rmdir_recursive("$dir/$file"); 
     else unlink("$dir/$file"); 
    } 

    rmdir($dir); 
} 

if(!empty($_FILES["file_name"]["name"])) { 
    $filename = $_FILES["file_name"]["name"]; 
    $source = $_FILES["file_name"]["tmp_name"]; 
    $type = $_FILES["file_name"]["type"]; 

    $name = explode(".", $filename); 
    $accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed'); 
    foreach($accepted_types as $mime_type) { 
     if($mime_type == $type) { 
      $okay = true; 
      break; 
     } 
    } 

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

    $path = dirname(__FILE__).'/'; 
    $filenoext = basename ($filename, '.zip'); 
    $filenoext = basename ($filenoext, '.ZIP'); 

    $targetdir = $path . $filenoext; 
    $targetzip = $path . $filename; 
    if (is_dir($targetdir)) rmdir_recursive ($targetdir); 

    mkdir($targetdir, 0777); 

    if(move_uploaded_file($source, $targetzip)) { 
     $zip = new ZipArchive(); 
     $x = $zip->open($targetzip); 
     if ($x === true) { 
      $zip->extractTo($targetdir.'/'); 
      $zip->close(); 

      unlink($targetzip); 
     } 
     $message = "Your file is uploaded and unpacked."; 
    } else { 
     $message = "There is a problem to upload."; 
    } 
} 

?> 

<?php if(isset($message)) echo "<p>$message</p>"; ?> 
<form enctype="multipart/form-data" method="post" action=""> 
    <label>Upload a zip file to upload: <input type="file" name="file_name" /></label> 
    <br /> 
    <input type="submit" name="submit" value="Upload" /> 
</form> 

希望這將有助於你和其他人

+0

爲什麼你在$'之間放置$ target_path?返回false,所以它永遠不會進入如果積極的條件..如果我刪除'''圍繞$ target_path它返回true,但當它做$ zip-> extractTo('應用/'.$用戶名);出現通常的錯誤。 –

+0

目標路徑是你的文件路徑名,在下面的例子中檢查它 –

+0

好吧,它的工作!但它只複製目標文件夾中沒有擴展名的zip壓縮文件而沒有解壓縮它。 –