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,


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

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).


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

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');

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> 

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?


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> 

0

Ubah saja

system('unzip $master.zip');

Untuk yang ini

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

atau yang ini

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


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

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

?>

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.