[php] PHP로 파일 압축 해제

파일의 압축을 풀고 싶습니다.

system('unzip File.zip');

그러나 URL을 통해 파일 이름을 전달해야하며 작동하지 못합니다. 이것이 내가 가진 것입니다.

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

내가 무엇을 놓치고 있습니까? 나는 그것이 간과하고있는 어리 석고 어리석은 것이되어야한다는 것을 안다.

감사합니다,



답변

코드가 온라인 어딘가의 자습서에서 온 것으로 가정 할 수 있습니까? 이 경우, 좋은 직업은 스스로 알아내는 것입니다. 다른 한편으로, 파일을 압축 해제하는 올바른 방법으로이 코드를 실제로 온라인 어딘가에 게시 할 수 있다는 사실은 약간 두렵습니다.

PHP에는 압축 파일 처리를위한 확장 기능이 내장되어 있습니다. 이를 위해 system호출 을 사용할 필요는 없습니다 . ZipArchivedocs 는 하나의 옵션입니다.

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

또한 다른 사람들이 언급 $HTTP_GET_VARS했듯이 버전 4.1 이후로 더 이상 사용되지 않습니다 … 사용하지 마십시오. $_GET대신 슈퍼 글로벌을 사용하십시오 .

마지막으로 $_GET변수 를 통해 스크립트에 전달 된 입력을 받아 들일 때 매우주의 하십시오.

항상 SANITIZE 사용자 입력.


최신 정보

귀하의 의견에 따라 zip 파일을 압축 파일이있는 동일한 디렉토리에 추출하는 가장 좋은 방법은 파일의 하드 경로를 결정하고 해당 위치로 추출하는 것입니다. 그래서 당신은 할 수 있습니다 :

// 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";
}


답변

그렇게하지 마십시오 (GET var를 시스템 호출의 일부로 전달). 대신 ZipArchive 를 사용하십시오 .

따라서 코드는 다음과 같아야합니다.

$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
}

그리고 귀하의 질문에 대답하기 위해, 귀하의 오류는 ‘$ var 무언가 다른 것’은 “$ var 무언가 다른 것”이어야합니다 (큰 따옴표).


답변

사용 getcwd()같은 디렉토리에 추출

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


답변

yourDestinationDir 은 루트 디렉토리로 추출하기 위해 -d yourDestinationDir 로 추출 하거나 제거 할 대상 입니다.

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


답변

@rdlowrey의 답변을 더 깨끗하고 더 나은 코드로 업데이트했습니다 __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> 


답변

PHP에는 zip 파일에서 압축을 풀거나 내용을 추출하는 데 사용할 수있는 자체 내장 클래스가 있습니다. 수업은 ZipArchive입니다. 다음은 zip 파일을 추출하여 특정 디렉토리에 저장하는 단순하고 기본적인 PHP 코드입니다.

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

고급 기능을 원한다면 아래에 zip 파일이 있는지 확인하는 개선 된 코드가 있습니다.

<?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";
}
?>

출처 : PHP에서 zip 파일의 압축을 풀거나 추출하는 방법은 무엇입니까?


답변

Morteza Ziaeemehr의 답변을 더 깨끗하고 더 나은 코드로 업데이트했습니다. 그러면 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>