Hướng dẫn dùng extract ed trong PHP

Tôi chỉ có thể cho rằng mã của bạn đến từ một hướng dẫn ở đâu đó trực tuyến? Trong trường hợp đó, hãy cố gắng tự mình tìm ra nó. Mặt khác, thực tế là mã này thực sự có thể được xuất bản trực tuyến ở đâu đó như một cách chính xác để giải nén một tệp tin là một điều hơi đáng sợ.

PHP có các phần mở rộng tích hợp để xử lý các tệp nén. Không cần thiết phải sử dụng systemcuộc gọi cho việc này. ZipArchivetài liệu là một trong những lựa chọn.

$zip = new ZipArchive;
$res = $zip->open('file.zip');
if ($res === TRUE) {
  $zip->extractTo('/myzips/extract_path/');
  $zip->close();
  echo 'woot!';
} else {
  echo 'doh!';
}

Ngoài ra, như những người khác đã nhận xét, $HTTP_GET_VARSđã không được chấp nhận kể từ phiên bản 4.1 ... đã được xem lại cách đây khá lâu. Đừng sử dụng nó. Sử dụng $_GETsuperglobal để thay thế.

Cuối cùng, hãy hết sức cẩn thận về việc chấp nhận bất kỳ đầu vào nào được chuyển đến tập lệnh thông qua một $_GETbiến.

LUÔN VỆ SINH ĐẦU VÀO CỦA NGƯỜI DÙNG.


CẬP NHẬT

Theo nhận xét của bạn, cách tốt nhất để giải nén tệp zip vào cùng một thư mục mà nó cư trú là xác định đường dẫn cứng đến tệp và giải nén cụ thể đến vị trí đó. Vì vậy, bạn có thể làm:

// assuming file.zip is in the same directory as the executing script.
$file = 'file.zip';

// get the absolute path to $file
$path = pathinfo(realpath($file), PATHINFO_DIRNAME);

$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
  // extract it to the path we determined above
  $zip->extractTo($path);
  $zip->close();
  echo "WOOT! $file extracted to $path";
} else {
  echo "Doh! I couldn't open $file";
}

534 hữu ích 5 bình luận chia sẻ

Tôi muốn giải nén một tập tin và điều này hoạt động tốt

system('unzip File.Zip');

Nhưng tôi cần chuyển tên tệp qua URL và không thể làm cho nó hoạt động, đây là những gì tôi có.

$master = $_GET["master"];
system('unzip $master.Zip'); 

Tôi đang thiếu gì? Tôi biết nó phải là một cái gì đó nhỏ bé và ngu ngốc mà tôi đang nhìn.

Cảm ơn bạn,

Tôi chỉ có thể giả sử mã của bạn đến từ một hướng dẫn ở đâu đó trực tuyến? Trong trường hợp đó, công việc tốt cố gắng tự mình tìm ra nó. Mặt khác, thực tế là mã này thực sự có thể được xuất bản trực tuyến ở đâu đó vì cách chính xác để giải nén một tệp là một chút đáng sợ.

PHP có các phần mở rộng tích hợp để xử lý các tệp nén. Không cần sử dụng các cuộc gọi system cho việc này. ZipArchive tài liệu là một lựa chọn.

$Zip = new ZipArchive;
$res = $Zip->open('file.Zip');
if ($res === TRUE) {
  $Zip->extractTo('/myzips/extract_path/');
  $Zip->close();
  echo 'woot!';
} else {
  echo 'doh!';
}

Ngoài ra, như những người khác đã nhận xét, $HTTP_GET_VARS đã bị từ chối kể từ phiên bản 4.1 ... một thời gian dài đã được xem xét lại từ lâu. Đừng sử dụng nó. Thay vào đó, hãy sử dụng siêu lớp $_GET.

Cuối cùng, hãy cẩn thận về việc chấp nhận bất kỳ đầu vào nào được chuyển đến tập lệnh thông qua biến $_GET.

LUÔN LUÔN VỆ SINH NGƯỜI DÙNG.


CẬP NHẬT

Theo nhận xét của bạn, cách tốt nhất để trích xuất tệp Zip vào cùng thư mục chứa nó là xác định đường dẫn cứng đến tệp và trích xuất cụ thể đến vị trí đó. Vì vậy, bạn có thể làm:

// assuming file.Zip is in the same directory as the executing script.
$file = 'file.Zip';

// get the absolute path to $file
$path = pathinfo(realpath($file), PATHINFO_DIRNAME);

$Zip = new ZipArchive;
$res = $Zip->open($file);
if ($res === TRUE) {
  // extract it to the path we determined above
  $Zip->extractTo($path);
  $Zip->close();
  echo "WOOT! $file extracted to $path";
} else {
  echo "Doh! I couldn't open $file";
}

Xin vui lòng, đừng làm như vậy (vượt qua GET var để trở thành một phần của cuộc gọi hệ thống). Sử dụng ZipArchive thay vào đó.

Vì vậy, mã của bạn sẽ trông như:

$zipArchive = new ZipArchive();
$result = $zipArchive->open($_GET["master"]);
if ($result === TRUE) {
    $zipArchive ->extractTo("my_dir");
    $zipArchive ->close();
    // Do something else on success
} else {
    // Do something on error
}

Và để trả lời câu hỏi của bạn, lỗi của bạn là 'cái gì đó $ var cái gì khác' phải là "cái gì đó $ var cái gì khác" (trong dấu ngoặc kép).

Sử dụng getcwd() để giải nén trong cùng thư mục

<?php
$unzip = new ZipArchive;
$out = $unzip->open('wordpress.Zip');
if ($out === TRUE) {
  $unzip->extractTo(getcwd());
  $unzip->close();
  echo 'File unzipped';
} else {
  echo 'Error';
}
?>

Tôi đã cập nhật câu trả lời của @ rdlowrey để mã sạch hơn và tốt hơn, Điều này sẽ giải nén một tệp vào thư mục hiện tại bằng cách sử dụng __DIR__.

<?php 
    // config
    // -------------------------------
    // only file name + .Zip
    $Zip_filename = "YOURFILENAME.Zip";
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' >
    <title>Unzip</title>
    <style>
        body{
            font-family: arial, sans-serif;
            Word-wrap: break-Word;
        }
        .wrapper{
            padding:20px;
            line-height: 1.5;
            font-size: 1rem;
        }
        span{
            font-family: 'Consolas', 'courier new', monospace;
            background: #eee;
            padding:2px;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <?php
        echo "Unzipping <span>" .__DIR__. "/" .$Zip_filename. "</span> to <span>" .__DIR__. "</span><br>";
        echo "current dir: <span>" . __DIR__ . "</span><br>";
        $Zip = new ZipArchive;
        $res = $Zip->open(__DIR__ . '/' .$Zip_filename);
        if ($res === TRUE) {
          $Zip->extractTo(__DIR__);
          $Zip->close();
          echo '<p style="color:#00C324;">Extract was successful! Enjoy ;)</p><br>';
        } else {
          echo '<p style="color:red;">Zip file not found!</p><br>';
        }
        ?>
        End Script.
    </div>
</body>
</html> 

Đơn giản chỉ cần thử điều này yourDestinationDir là đích để trích xuất hoặc xóa - d yourDestinationDir để giải nén vào thư mục gốc.

$master = 'someDir/zipFileName';
$data = system('unzip -d yourDestinationDir '.$master.'.Zip');

PHP có lớp inbuilt riêng có thể được sử dụng để giải nén hoặc trích xuất nội dung từ tệp Zip. Lớp học là ZipArchive. Dưới đây là mã PHP đơn giản và cơ bản sẽ trích xuất tệp Zip và đặt nó vào một thư mục cụ thể:

<?php
$Zip_obj = new ZipArchive;
$Zip_obj->open('dummy.Zip');
$Zip_obj->extractTo('directory_name/sub_dir');
?>

Nếu bạn muốn một số tính năng nâng cao thì bên dưới là mã được cải tiến sẽ kiểm tra xem tệp Zip có tồn tại hay không:

<?php
$Zip_obj = new ZipArchive;
if ($Zip_obj->open('dummy.Zip') === TRUE) {
   $Zip_obj->extractTo('directory/sub_dir');
   echo "Zip exists and successfully extracted";
}
else {
   echo "This Zip file does not exists";
}
?>

Nguồn: Cách giải nén hoặc giải nén tệp Zip trong PHP?

bạn có thể sử dụng chức năng đóng gói sẵn

function unzip_file($file, $destination){
    // create object
    $Zip = new ZipArchive() ;
    // open archive
    if ($Zip->open($file) !== TRUE) {
        return false;
    }
    // extract contents to destination directory
    $Zip->extractTo($destination);
    // close archive
    $Zip->close();
        return true;
}

Làm thế nào để sử dụng nó.

if(unzip_file($file["name"],'uploads/')){
echo 'Zip archive extracted successfully';
}else{
  echo 'Zip archive extraction failed';
}

Tôi đã cập nhật câu trả lời của Morteza Ziaeemehr để mã sạch hơn và tốt hơn, Điều này sẽ giải nén một tệp được cung cấp trong biểu mẫu vào thư mục hiện tại bằng cách sử dụng DIR.

<!DOCTYPE html>
<html>
<head>
  <meta charset='utf-8' >
  <title>Unzip</title>
  <style>
  body{
    font-family: arial, sans-serif;
    Word-wrap: break-Word;
  }
  .wrapper{
    padding:20px;
    line-height: 1.5;
    font-size: 1rem;
  }
  span{
    font-family: 'Consolas', 'courier new', monospace;
    background: #eee;
    padding:2px;
  }
  </style>
</head>
<body>
  <div class="wrapper">
    <?php
    if(isset($_GET['page']))
    {
      $type = $_GET['page'];
      global $con;
      switch($type)
        {
            case 'unzip':
            {    
                $Zip_filename =$_POST['filename'];
                echo "Unzipping <span>" .__DIR__. "/" .$Zip_filename. "</span> to <span>" .__DIR__. "</span><br>";
                echo "current dir: <span>" . __DIR__ . "</span><br>";
                $Zip = new ZipArchive;
                $res = $Zip->open(__DIR__ . '/' .$Zip_filename);
                if ($res === TRUE) 
                {
                    $Zip->extractTo(__DIR__);
                    $Zip->close();
                    echo '<p style="color:#00C324;">Extract was successful! Enjoy ;)</p><br>';
                } 
                else 
                {
                    echo '<p style="color:red;">Zip file not found!</p><br>';
                }
                break;
            }
        }
    }
?>
End Script.
</div>
    <form name="unzip" id="unzip" role="form">
        <div class="body bg-gray">
            <div class="form-group">
                <input type="text" name="filename" class="form-control" placeholder="File Name (with extension)"/>
            </div>        
        </div>
    </form>

<script type="application/javascript">
$("#unzip").submit(function(event) {
  event.preventDefault();
    var url = "function.php?page=unzip"; // the script where you handle the form input.
    $.ajax({
     type: "POST",
     url: url,
     dataType:"json",
           data: $("#unzip").serialize(), // serializes the form's elements.
           success: function(data)
           {
               alert(data.msg); // show response from the php script.
               document.getElementById("unzip").reset();
             }

           });

    return false; // avoid to execute the actual submit of the form
  });
</script>
</body>
</html> 

Sử dụng bên dưới mã PHP, với tên tệp trong thông số URL "name"

<?php

$fileName = $_GET['name'];

if (isset($fileName)) {


    $Zip = new ZipArchive;
    $res = $Zip->open($fileName);
    if ($res === TRUE) {
      $Zip->extractTo('./');
      $Zip->close();
      echo 'Extracted file "'.$fileName.'"';
    } else {
      echo 'Cannot find the file name "'.$fileName.'" (the file name should include extension (.Zip, ...))';
    }
}
else {
    echo 'Please set file name in the "name" param';
}

?>

Chỉ là sự thay đổi

system('unzip $master.Zip');

Để cái này

system('unzip ' . $master . '.Zip');

hoặc cái này

system("unzip {$master}.Zip");