Php ile bir dosyayı açın


200

Bir dosyayı açmak istiyorum ve bu iyi çalışıyor

system('unzip File.zip');

Ama URL üzerinden dosya adını geçmek gerekir ve işe alamıyorum, bu benim var.

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

Neyi kaçırıyorum? Küçük ve aptalca bir şey olması gerektiğini biliyorum.

Teşekkür ederim,


35
Çift tırnak değişkenleri değerlendirir; tek tırnak yok. AMA - bir sistem çağrısına bazı girdilerin iletilmesi oldukça tehlikeli olabileceğinden dikkatli olun.
Wiseguy

25
Bazı yorumların düşman tonunu sevmediğimi söylemeliyim. Eğer onun bir şeyleri kaçırdığını fark ederseniz, ona söyleyin. Hepimiz bir noktada bir şeyleri özlüyoruz.
Sebastian Mach

Buradaki hata basit. Çift tırnak yerine basit tırnaklarla dize enterpolasyonu kullanmaya çalışıyorsunuz. Dize enterpolasyonu, dize değişmez değerleri için kullanıldığı için basit tırnaklarla çalışmaz. Bu nedenle, kodunuzu değiştirmek system("unzip $master.zip");işe yarayacaktır.
Asier Paz

Yanıtlar:


503

Kodunuzun çevrimiçi bir yerde bir öğreticiden geldiğini varsayabilir miyim? Bu durumda, bunu kendiniz anlamaya çalışmak iyi bir iş. Öte yandan, bu kodun bir dosyayı çevrimiçi olarak açmanın doğru yolu olarak çevrimiçi bir yerde yayınlanabilmesi biraz korkutucu.

PHP, sıkıştırılmış dosyalarla uğraşmak için yerleşik uzantılara sahiptir. Bunun için systemçağrı kullanmaya gerek yoktur . ZipArchivedocs bir seçenektir.

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

Ayrıca, diğerlerinin de yorumladığı gibi, $HTTP_GET_VARS4.1'den beri uzun süredir kullanımdan kaldırıldı. Kullanma. Kullanım $_GETyerine süper küreselini.

Son olarak, bir komut dosyasına bir $_GETdeğişken aracılığıyla hangi girdilerin aktarıldığını kabul etmek konusunda çok dikkatli olun .

HER ZAMAN KULLANICI GİRİŞİNİ DÜZELTİN.


GÜNCELLEME

Yorumunuza göre, zip dosyasını içinde bulunduğu aynı dizine çıkarmanın en iyi yolu, dosyanın sabit yolunu belirlemek ve özellikle o konuma ayıklamaktır. Böylece şunları yapabilirsiniz:

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

Tavsiye için teşekkürler. Ben bu konuda yeniyim ve sadece her şeyi anlıyorum. Kodunuzla, sıkıştırılmış dosyanın bulunduğu klasörde açılmasını nasıl sağlayabilirim?
BostonBB

2
Komut dosyanızın geçerli çalışma dizini ile zip dosyasının bulunduğu dizin arasında bir fark vardır. Zip dosyası, komut dosyasıyla aynı dizindeyse $zip->extractTo('./');Ancak, bu büyük olasılıkla geçerli değildir. Daha iyi bir seçenek, zip dosyasının dosya sistemindeki konumunu belirlemek ve orada ayıklamaktır. Göstermek için cevabımı güncelleyeceğim.
rdlowrey

ZipArchive sınıfınız yoksa ne olur? Ben bok barındırma bir sitede çalışıyorum ve ben Fatal error: Class 'ZipArchive' not foundbu komut dosyası denemek hata alıyorum :-( Bu noktada herhangi bir seçenek var mı?
CWSpear

2
@CWSpear , PHP ile hemen hemen tüm sıkıştırma / açma işlemlerini gerçekleştirmek için temelzlib kütüphaneye ihtiyacınız olacak . Sistem çağrıları yapmak için bile temel kütüphaneye sahip olmanız gerekir. Bu çok yaygın bir şey olsa da, buna sahip olmamak istisnadır. Paylaşılan hosting kullanıyorsanız, sizin için yüklemelidirler. Aksi takdirde, sadece "PHP için Zip İşlevleri Desteği Nasıl Kurulur" gibi bir şey google
rdlowrey

Evet, bana söylendiđi gibi oldukça ucuz bir hosting. Neyse, cevap için teşekkürler, bilmek iyi şeyler.
CWSpear

38

Lütfen bunu böyle yapmayın (GET değişkenini geçmek sistem çağrısının bir parçası olmak için). Kullanım ZipArchive yerine.

Yani, kodunuz şöyle görünmelidir:

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

Ve sorunuzu cevaplamak için hatanız '$ var başka bir şey' olmalıdır "$ var başka bir şey" (çift tırnak içinde).


3
+1 Hata, beş dakika sonra aynı cevabı verdiğim için üzgünüm. Seni orada görmedim :)
rdlowrey

10

getcwd()Aynı dizinde ayıklamak için kullanma

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

5

Sadece bunu deneyinDestinationDir kök dizinine ayıklamak veya -d sizinDestinationDir çıkarmak için hedef .

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

1
Ben oturum klasöründe unzip hedef klasör nerede yourDestinationDirolarak kullanılır . session_save_path() . DIRECTORY_SEPARATOR . "$name" . DIRECTORY_SEPARATOR$name
Ramratan Gupta

1
Değişkenler içeren sistem veya yürütme işlevleriyle uğraşırken gerçekten dikkatli olun! Sunucunuzdan bir hacker'a ücretsiz bir komut satırı verebilir.
maksimum

@maxime Bu nasıl mümkün olabilir? lütfen açıklayın çünkü ben bunu önlemek için önlem olarak php düşünüyorum. Taleplerinizi gerçeklerle destekleyin
Samuel Kwame Antwi

@SamuelKwameAntwi exec ve sistem php kullanıcısı ile sistem kabuğunu çağırıyor. Dolayısıyla, kullanıcınız www ise, dosya veya dizinlerin kaldırılması da dahil olmak üzere, "www" nin unix kullanıcısının komut satırında yapabileceği her şeyi yapabilirsiniz. Gerçekten php kullanıcı kök ise kötü. Bu konuda daha fazla bilgiyi burada bulabilirsiniz: stackoverflow.com/questions/3115559/exploitable-php-functions
maxime

5

@Rdlowrey cevabını daha temiz ve daha iyi bir koda güncelledim, Bu dosyayı kullanarak mevcut dizine açacak __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> 

2

PHP, bir zip dosyasından içeriği açmak veya çıkartmak için kullanılabilecek kendi dahili sınıfına sahiptir. Sınıf ZipArchive. Aşağıda, bir zip dosyasını ayıklayıp belirli bir dizine yerleştirecek basit ve temel PHP kodu verilmiştir:

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

Bazı gelişmiş özellikler istiyorsanız, zip dosyasının var olup olmadığını kontrol edecek geliştirilmiş kod aşağıdadır:

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

Kaynak: PHP zip dosyalarını açmak veya ayıklamak nasıl?


0

Morteza Ziaeemehr'in cevabını daha temiz ve daha iyi bir koda güncelledim. Bu, form içinde sağlanan bir dosyayı DIR kullanarak mevcut dizine çıkartır .

<!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

Sadece değiştir

system('unzip $master.zip');

Buna

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

ya da bu

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


6
Bu, sahip olduğu sorunu çözebilirken, bunun neden kötü tavsiye olduğunu görmek için diğer cevaplara bir göz atın.
rjdown

0

önceden paketlenmiş işlevi kullanabilirsiniz

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

Bu nasıl kullanılır.

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

0

PHP adı altında, "name" URL parametresinde dosya adı ile birlikte kullanın

<?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

Sıkıştırmak için basit PHP işlevi. Lütfen sunucunuzda zip uzantısı yüklü olduğundan emin olun.

/**
 * Unzip
 * @param string $zip_file_path Eg - /tmp/my.zip
 * @param string $extract_path Eg - /tmp/new_dir_name
 * @return boolean
 */
function unzip(string $zip_file_path, string $extract_dir_path) {
    $zip = new \ZipArchive;
    $res = $zip->open($zip_file_path);
    if ($res === TRUE) {
        $zip->extractTo($extract_dir_path);
        $zip->close();
        return TRUE;
    } else {
        return FALSE;
    }
}

-3

Sadece şunu kullanın:

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

kodunuzda $masterbir dize olarak geçirilirse, sistem adlı bir dosyayı arayacaktır.$master.zip

  $master = $_GET["master"];
  system('unzip $master.zip'); `enter code here`

5
Tamamen yanlış. 'unzip' $masterunzip'ten sonra bir boşluk eklemedikten ve tek tırnaktan sonra bir nokta eklemediyseniz çalışmaz. system("unzip $master.zip")Çift tırnak veya en azından geçerli bir cevap ile önermek çok daha kolay olurdu .
Nicholas Blasgen

1
PHP sistem fonksiyonlarını kullanmak, sistem fonksiyonlarına güvenmekten daha iyidir.
Sloan Thrasher

Kabul edilen cevapta vurgulandığı gibi - lütfen kullanıcı girişini sterilize edin , herkes bu $_GETsorgu dizesine bir şey ekleyebilir ve systemçağrıya kendi kodunu enjekte edebilir
jg2703
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.