web-dev-qa-db-ja.com

phpでファイルを解凍する

ファイルを解凍したいのですが、これでうまくいきます。

system('unzip File.Zip');

しかし、私はURLを通してファイル名を渡す必要があり、それを機能させることができません、これは私が持っているものです。

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

何が足りないの?私はそれが私が見下ろしている何か小さくて愚かでなければならないことを知っています。

ありがとうございました、

179
BostonBB

私はあなたのコードがどこかのオンラインのチュートリアルから来たと思うことができるだけですか?その場合は、自分で解決しようとするのがいい仕事です。一方、ファイルを解凍する正しい方法としてこのコードが実際にどこかでオンラインで公開される可能性があるという事実は少し恐ろしいです。

PHPには、圧縮ファイルを扱うための組み込みの拡張機能があります。これにはsystemname__呼び出しを使用する必要はありません。 ZipArchivename __ ドキュメント は1つの選択肢です。

$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ユーザー入力。


UPDATE

あなたのコメントによれば、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";
}
450
rdlowrey

そのようにしないでください(GETを渡すとシステムコールの一部になります)。代わりに 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何か他のもの」であるべきです(二重引用符で).

34

getcwd()を使って同じディレクトリに展開する

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

私は@ 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> 
4

単に試してみてくださいyourDestinationDirは抽出または削除先です - d yourDestinationDirルートディレクトリに抽出する。

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

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ファイルを解凍または抽出するにはどうすればよいですか?

あなたはプレパック機能を使用することができます

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

どうやって使うのですか。

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

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> 
0
Varun Naharia

PHPコードの下に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';
}

?>
0
huync

変更するだけ

system('unzip $master.Zip');

これに

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

またはこれ

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

0
user3225732