Buka zip file dengan php

199

Saya ingin membuka zip file dan ini berfungsi dengan baik

system('unzip File.zip');

Tapi saya harus memasukkan nama file melalui URL dan tidak bisa membuatnya berfungsi, inilah yang saya miliki.

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

Apa yang saya lewatkan? Saya tahu itu pasti sesuatu yang kecil dan bodoh yang saya hadapi.

Terima kasih,

BostonBB
sumber
35
Kutipan ganda mengevaluasi variabel; Kutipan tunggal tidak. TETAPI - berhati-hatilah, hanya dengan memberikan beberapa input ke panggilan sistem bisa sangat berbahaya.
Wiseguy
25
Harus mengatakan saya tidak suka nada bermusuhan dari beberapa komentar. Jika kalian sadar dia kehilangan barang, maka katakan saja padanya. Kita semua kehilangan sesuatu di beberapa titik.
Sebastian Mach
Kesalahan di sini sederhana. Anda mencoba menggunakan interpolasi string dengan tanda kutip sederhana, bukan tanda kutip ganda. Interpolasi string tidak bekerja dengan kutipan sederhana karena ini digunakan untuk string literal. Jadi, mengubah kode Anda system("unzip $master.zip");harus bekerja.
Asier Paz

Jawaban:

500

Saya hanya dapat menganggap kode Anda berasal dari tutorial di suatu tempat online? Dalam hal itu, pekerjaan yang baik berusaha mencari tahu sendiri. Di sisi lain, fakta bahwa kode ini sebenarnya dapat dipublikasikan secara online di suatu tempat karena cara yang benar untuk meng-unzip file agak menakutkan.

PHP memiliki ekstensi bawaan untuk menangani file terkompresi. Seharusnya tidak perlu menggunakan systempanggilan untuk ini. ZipArchivedocs adalah salah satu opsi.

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

Juga, seperti komentar orang lain, $HTTP_GET_VARSsudah tidak digunakan lagi sejak versi 4.1 ... yang sudah lama sekali. Jangan gunakan itu. Gunakan $_GETsuperglobal sebagai gantinya.

Akhirnya, berhati-hatilah dalam menerima input apa pun yang diteruskan ke skrip melalui $_GETvariabel.

SELALU MENG Sanitasi INPUT PENGGUNA.


MEMPERBARUI

Sesuai komentar Anda, cara terbaik untuk mengekstrak file zip ke direktori yang sama di mana ia berada adalah untuk menentukan jalur keras ke file dan mengekstraknya secara khusus ke lokasi itu. Jadi, Anda bisa melakukan:

// 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";
}
rdlowrey
sumber
Terima kasih atas sarannya. Saya baru dalam hal ini dan hanya memikirkan semuanya. Dengan kode Anda, bagaimana saya bisa unzip di folder yang sama dengan file zip?
BostonBB
2
Nah, ada perbedaan antara direktori kerja skrip Anda saat ini dan direktori tempat file zip berada. Jika file zip berada di direktori yang sama dengan skrip yang bisa Anda lakukan $zip->extractTo('./');Namun, ini mungkin tidak terjadi. Pilihan yang lebih baik adalah menentukan lokasi file zip di sistem file dan mengekstraknya di sana. Saya akan memperbarui jawaban saya untuk menunjukkan.
rdlowrey
Bagaimana jika Anda tidak memiliki kelas ZipArchive yang tersedia? Saya sedang mengerjakan situs dengan hosting omong kosong dan saya mendapatkan Fatal error: Class 'ZipArchive' not foundkesalahan yang saya coba skrip ini :-( Apakah ada opsi pada saat itu?
CWSpear
2
@CWSpear Anda akan membutuhkanzlib pustaka yang mendasari untuk melakukan hampir semua operasi kompres / dekompresi dengan PHP. Bahkan untuk membuat panggilan sistem Anda harus memiliki pustaka yang mendasarinya. Ini adalah hal yang sangat di mana-mana, dan tidak memilikinya adalah pengecualian. Jika Anda menggunakan hosting bersama, mereka harus menginstalnya untuk Anda. Kalau tidak, hanya google sesuatu seperti "Bagaimana Cara Menginstal Dukungan Fungsi Zip Untuk PHP"
rdlowrey
Ya, ini hosting yang cukup murah seperti yang pernah saya dengar. Bagaimanapun, terima kasih atas jawabannya, itu hal yang baik untuk diketahui.
CWSpear
38

Tolong, jangan lakukan itu seperti itu (melewati GET var untuk menjadi bagian dari panggilan sistem). Gunakan ZipArchive sebagai gantinya.

Jadi, kode Anda akan terlihat seperti:

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

Dan untuk menjawab pertanyaan Anda, kesalahan Anda adalah 'sesuatu $ var sesuatu yang lain' harus menjadi "sesuatu $ var sesuatu yang lain" (dalam tanda kutip ganda).

Aleksandar Vucetic
sumber
3
+1 Ups, maaf karena mengerjakan pada dasarnya jawaban yang sama lima menit kemudian. Tidak melihatmu di sana :)
rdlowrey
10

Menggunakan getcwd()untuk mengekstrak di direktori yang sama

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

Cukup coba thisDestinationDir Anda adalah tujuan untuk mengekstrak atau menghapus -d yourDestinationDir untuk mengekstrak ke dir root.

$master = 'someDir/zipFileName';
$data = system('unzip -d yourDestinationDir '.$master.'.zip');
Samuel Kwame Antwi
sumber
1
Saya digunakan yourDestinationDirsebagai session_save_path() . DIRECTORY_SEPARATOR . "$name" . DIRECTORY_SEPARATOR tempat $namefolder target untuk unzip di folder sesi.
Ramratan Gupta
1
Berhati-hatilah saat berurusan dengan fungsi sistem atau exec yang berisi variabel! Ini dapat litteraly memberikan baris perintah gratis dari server Anda ke seorang hacker.
maksimal
@ Maxime Bagaimana itu mungkin? tolong jelaskan karena saya pikir php sebagai ukuran untuk menghentikan hal itu terjadi. Dukung klaim Anda dengan fakta
Samuel Kwame Antwi
@SamuelKwameAntwi exec dan sistem memanggil shell sistem, dengan pengguna php. Jadi, jika pengguna Anda adalah www, Anda dapat melakukan semua yang dapat dilakukan pengguna unix "www" pada baris perintah, termasuk menghapus file atau direktori. Ini benar-benar terburuk jika pengguna php Anda adalah root. Anda dapat menemukan lebih banyak info tentang hal itu di sana: stackoverflow.com/questions/3115559/exploitable-php-functions
maxime
5

Saya memperbarui jawaban @rdlowrey ke kode yang lebih bersih dan lebih baik, Ini akan membuka zip file ke direktori saat ini menggunakan __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> 
Morteza Ziyae
sumber
2

PHP memiliki kelas inbuilt sendiri yang dapat digunakan untuk unzip atau mengekstrak konten dari file zip. Kelasnya adalah ZipArchive. Di bawah ini adalah kode PHP sederhana dan dasar yang akan mengekstrak file zip dan menempatkannya di direktori tertentu:

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

Jika Anda menginginkan beberapa fitur lanjutan maka di bawah ini adalah kode yang disempurnakan yang akan memeriksa apakah file zip ada atau tidak:

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

Sumber: Bagaimana cara unzip atau mengekstrak file zip dalam PHP?

Faruque Ahamed Mollick
sumber
0

Saya memperbarui jawaban Morteza Ziaeemehr ke kode yang lebih bersih dan lebih baik, Ini akan membuka zip file yang disediakan dalam bentuk ke direktori saat ini menggunakan 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> 
Varun Naharia
sumber
0

Ubah saja

system('unzip $master.zip');

Untuk yang ini

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

atau yang ini

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

sh4nn0nb1t
sumber
6
Meskipun ini dapat memperbaiki masalah yang dia alami, lihat jawaban lain untuk melihat mengapa ini saran yang buruk.
rjdown
0

Anda dapat menggunakan fungsi prepacked

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

Bagaimana cara menggunakannya.

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

Gunakan kode PHP di bawah ini, dengan nama file di URL param "nama"

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

?>
Huync
sumber
0

Fungsi PHP sederhana untuk unzip. Pastikan Anda memiliki ekstensi zip yang diinstal di server Anda.

/**
 * 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;
    }
}
M_R_K
sumber
-3

Gunakan ini saja:

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

dalam kode Anda $masterditeruskan sebagai string, sistem akan mencari file bernama$master.zip

  $master = $_GET["master"];
  system('unzip $master.zip'); `enter code here`
Dennis Kiptugen
sumber
5
Benar-benar salah. 'unzip' $mastertidak akan berfungsi kecuali jika Anda menambahkan spasi setelah unzip dan menambahkan periode setelah kutipan tunggal. Akan jauh lebih mudah untuk menyarankan system("unzip $master.zip")dengan tanda kutip ganda, atau setidaknya jawaban yang valid.
Nicholas Blasgen
1
Lebih baik menggunakan fungsi sistem PHP daripada mengandalkan fungsi sistem.
Sloan Thrasher
Sebagaimana ditekankan dalam jawaban yang diterima - tolong bersihkan input pengguna, siapa pun dapat menambahkan apa pun ke $_GETstring kueri ini dan menyuntikkan kode mereka sendiri ke systempanggilan
jg2703