পিএইচপি সহ একটি ফাইল আনজিপ করুন


198

আমি একটি ফাইল আনজিপ করতে চাই এবং এটি দুর্দান্ত কাজ করে

system('unzip File.zip');

তবে ফাইলের নামটি ইউআরএল দিয়ে আমার পাস করতে হবে এবং এটি কাজ করতে পারছে না, এটি আমার কাছে রয়েছে।

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

আমি কী মিস করছি? আমি জানি এটি কিছু ছোট এবং বোকা হতে হবে যা আমি উপেক্ষা করছি।

ধন্যবাদ,


35
ডাবল উদ্ধৃতিগুলি ভেরিয়েবলগুলি মূল্যায়ন করে; একক উদ্ধৃতি না। তবে - সাবধানতা অবলম্বন করুন, কেবল কোনও সিস্টেম কলের জন্য কিছু ইনপুট পাস করা বেশ বিপজ্জনক হতে পারে।
উইজগুয়ে

25
অবশ্যই বলতে হবে আমি কিছু মন্তব্যের বৈরী সুর পছন্দ করি না। যদি আপনি ছেলেরা বুঝতে পারেন যে সে / সে মাতাল কিছু হারিয়েছে, তবে কেবল তাকে / তাকে এটি সম্পর্কে বলুন। আমরা সকলেই কিছু না কিছু মিস করি।
সেবাস্তিয়ান মাচ

এখানে ত্রুটিটি সহজ। আপনি ডাবল কোটের পরিবর্তে সরল উদ্ধৃতি দিয়ে স্ট্রিং ইন্টারপোলেশন ব্যবহার করার চেষ্টা করছেন। স্ট্রিং ইন্টারপোলেশন সাধারণ কোটগুলির সাথে কাজ করে না কারণ এটি স্ট্রিং লিটারেলের জন্য ব্যবহৃত হয়। সুতরাং, আপনার কোড পরিবর্তন করে system("unzip $master.zip");কাজ করা উচিত।
এশিয়ার পাজ

উত্তর:


500

আমি কেবল আপনার কোডটি কোথাও কোথাও টিউটোরিয়াল থেকে অনুমান করতে পারি? সেক্ষেত্রে ভাল কাজ নিজেই এটি বের করার চেষ্টা করছে। অন্যদিকে, কোনও ফাইল আনজিপ করার সঠিক উপায় হিসাবে এই কোডটি আসলে কোথাও অনলাইনে প্রকাশিত হতে পারে তা কিছুটা ভীতিজনক ing

পিএইচপি সংকুচিত ফাইলগুলির সাথে ডিল করার জন্য অন্তর্নির্মিত এক্সটেনশন রয়েছে। এর systemজন্য কলগুলি ব্যবহার করার দরকার নেই । ZipArchiveডক্স একটি বিকল্প is

$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সংস্করণ ৪.১ থেকে অবহেলিত হয়েছে ... যা বহু আগে প্রকাশ পেয়েছিল। এটি ব্যবহার করবেন না। ব্যবহার$_GET পরিবর্তে superglobal হয়।

অবশেষে, কোনও স্ক্রিপ্টে যে কোনও ইনপুট যেভাবে দেওয়া হয় তা গ্রহণের বিষয়ে খুব সাবধান হন $_GET ভেরিয়েবলের ।

সর্বদা ব্যবহারকারী ইনপুট সন্তুষ্ট।


হালনাগাদ

আপনার মন্তব্য অনুসারে, জিপ ফাইলটিকে একই ডিরেক্টরিতে যেখানে এটি রয়েছে তার থেকে বের করে আনার সর্বোত্তম উপায় হ'ল ফাইলটির হার্ড পাথ নির্ধারণ করা এবং সেই জায়গাটিতে বিশেষত এটি বের করা। সুতরাং, আপনি কি করতে পারেন:

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

পরামর্শের জন্য আপনাকে ধন্যবাদ। আমি এটিতে নতুন এবং কেবল সবকিছু খুঁজে বের করছি। আপনার কোড সহ, জিপড ফাইলটি যে একই ফোল্ডারে রয়েছে আমি কীভাবে এটি আনজিপ করতে পারি?
বোস্টনবিবি

2
ঠিক আছে, আপনার স্ক্রিপ্টের বর্তমান কার্যনির্বাহী ডিরেক্টরি এবং জিপ ফাইলটি যে ডিরেক্টরিটিতে রয়েছে তার মধ্যে একটি পার্থক্য রয়েছে। জিপ ফাইল যদি আপনি যে স্ক্রিপ্টটি করতে পারতেন ঠিক একই ডিরেক্টরিতে থাকে $zip->extractTo('./');তবে সম্ভবত এটি ঘটবে না। একটি আরও ভাল বিকল্প হ'ল ফাইল সিস্টেমে জিপ ফাইলের অবস্থান নির্ধারণ করা এবং এটি সেখানে বের করা। আমি আমার উত্তরটি প্রদর্শন করতে আপডেট করব।
rdlowrey

আপনার কাছে জিপআরচাইভ ক্লাস না থাকলে কী হবে? আমি ক্রেপ হোস্টিংয়ের সাথে একটি সাইটে কাজ করছি এবং আমি Fatal error: Class 'ZipArchive' not foundএই স্ক্রিপ্টটি চেষ্টা করে যা ত্রুটি পেয়েছি :-( সেই সময়ে কোনও বিকল্প আছে কি?
সিডাব্লুস্পায়ার

2
@ সিডব্লুস্পিয়ার আপনার পিএইচপি দিয়ে কোনও কমপ্রেস / ডিকম্প্রেস অপারেশন সম্পাদন করার জন্য অন্তর্নিহিতzlib লাইব্রেরির প্রয়োজন হবে। এমনকি সিস্টেম কল করতে আপনার অন্তর্নিহিত লাইব্রেরি থাকা দরকার। যদিও এটি খুব সর্বব্যাপী জিনিস এবং এটি না হওয়াও ব্যতিক্রম। আপনি যদি শেয়ার্ড হোস্টিংয়ে থাকেন তবে তাদের এটি আপনার জন্য ইনস্টল করা উচিত। অন্যথায়, "পিএইচপি জন্য জিপ ফাংশন সমর্থন কীভাবে ইনস্টল করতে হবে" এর মতো কিছু গুগল করুন
rdlowrey

হ্যাঁ, আমার বলা হিসাবে এটি বেশ সস্তা হোস্টিং। যাইহোক, উত্তরের জন্য ধন্যবাদ, এটি জানতে ভাল জিনিস stuff
সিডব্লিউস্পিয়ার

37

দয়া করে, এটির মতো করবেন না (জিইটি ভার পাস করে কোনও সিস্টেম কলের অংশ হতে পারে)। জিপআর্কাইভ ব্যবহার করুন পরিবর্তে।

সুতরাং, আপনার কোডটি দেখতে হবে:

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

এবং আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আপনার ত্রুটিটি হ'ল 'কিছু $ কিছু অন্যরকম' হওয়া উচিত "কিছু" কিছু অন্যরকম "(ডাবল উদ্ধৃতিতে)।


3
+1 উফ, পাঁচ মিনিট পরে মূলত একই উত্তরটি সন্ধান করার জন্য দুঃখিত sorry আপনাকে সেখানে
দেখেনি

10

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

সহজভাবে এইটি চেষ্টা করুন আপনার ডিস্টেইনশনডির গন্তব্য হ'ল আপনার ডিস্টেটিশনডির থেকে মূল ডিয়ারে এক্সট্র্যাক্ট করতে বা সরিয়ে ফেলার ।

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

1
আমি সেশন ফোল্ডারে আনজিপ করতে যেখানে লক্ষ্য ফোল্ডারটি yourDestinationDirহিসাবে ব্যবহার করেছি । session_save_path() . DIRECTORY_SEPARATOR . "$name" . DIRECTORY_SEPARATOR$name
রামরতন গুপ্ত

1
সিস্টেম বা এক্সিকিউটিভ ফাংশনগুলির সাথে ডিল করার সময় সত্যই সতর্ক থাকুন যার মধ্যে ভেরিয়েবল রয়েছে! এটি লিখিতভাবে আপনার সার্ভার থেকে হ্যাকারকে একটি বিনামূল্যে কমান্ড লাইন দিতে পারে।
Maxime

@ ম্যাক্সিম কিভাবে এটি সম্ভব? দয়া করে ব্যাখ্যা করুন কারণ আমি মনে করি পিএইচপি এটি ঘটতে থামাতে পরিমাপ হিসাবে। আপনার দাবির
সত্যতা

@ সামুয়েলকামেআন্টভি এক্সিকিউটিভ এবং সিস্টেম পিএইচপি ব্যবহারকারী দ্বারা সিস্টেম শেল কল করছে। সুতরাং, আপনার ব্যবহারকারী যদি www হয়, আপনি ইউনিক্স ব্যবহারকারী "www" ফাইল বা ডিরেক্টরি মুছে ফেলা সহ কমান্ড লাইনে যা করতে পারেন তা করতে পারেন। আপনার পিএইচপি ব্যবহারকারী রুট হলে এটি সত্যিই সবচেয়ে খারাপ। : আপনি সেখানে এটি সম্পর্কে আরও তথ্য পেতে পারেন stackoverflow.com/questions/3115559/exploitable-php-functions
Maxime

5

আমি একটি ক্লিনার এবং আরও ভাল কোডে @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> 

2

পিএইচপি-র নিজস্ব ইনবিল্ট ক্লাস রয়েছে যা একটি জিপ ফাইল থেকে সামগ্রী আনজিপ করতে বা উত্তোলন করতে ব্যবহৃত হতে পারে। ক্লাসটি জিপআরচাইভ। নীচে একটি সহজ এবং মৌলিক পিএইচপি কোড রয়েছে যা একটি জিপ ফাইলটি বের করে একটি নির্দিষ্ট ডিরেক্টরিতে রাখবে:

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

আপনি যদি কিছু অগ্রিম বৈশিষ্ট্য চান তবে নীচে উন্নত কোডটি যা জিপ ফাইলের উপস্থিতি আছে কিনা তা যাচাই করবে:

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

উত্স: পিএইচপি-তে জিপ ফাইল আনজিপ বা এক্সট্রাক্ট করবেন কীভাবে?


0

আমি একটি ক্লিনার এবং আরও ভাল কোডে মুর্তিজা জিয়ামেহরের উত্তর আপডেট করেছি , এটি ডিআইআর ব্যবহার করে ফর্মের মধ্যে প্রদত্ত একটি ফাইলকে বর্তমান ডিরেক্টরিতে আনজিপ করে দেবে ।

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

শুধু পরিবর্তন

system('unzip $master.zip');

এই এক

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

বা এই এক

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


6
যদিও এটি তার যে সমস্যাটি নিয়ে আসছিল তা সংশোধন করতে পারে, তবে এটি কেন খারাপ পরামর্শ তা দেখতে অন্যান্য উত্তরগুলি একবার দেখুন।
rjdown

0

আপনি প্রিপ্যাকড ফাংশন ব্যবহার করতে পারেন

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

ইউআরএল পরম "নাম" এ ফাইলের নাম সহ পিএইচপি কোডের নীচে ব্যবহার করুন

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

আনজিপ করা সহজ পিএইচপি ফাংশন। আপনি আপনার সার্ভারে জিপ এক্সটেনশন ইনস্টল করেছেন তা নিশ্চিত করুন।

/**
 * 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

কেবল এটি ব্যবহার করুন:

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

আপনার $masterকোডটিতে একটি স্ট্রিং হিসাবে পাস করা হয়েছে, সিস্টেম কল করা কোনও ফাইল সন্ধান করবে$master.zip

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

5
শুধু সম্পূর্ণ ভুল। 'unzip' $masterআপনি আনজিপ করার পরে কোনও স্থান যোগ না করে এবং একক উদ্ধৃতির পরে একটি সময় যোগ না করে কাজ করবে না। system("unzip $master.zip")ডাবল উদ্ধৃতি বা কমপক্ষে একটি বৈধ উত্তর দিয়ে পরামর্শ দেওয়ার জন্য আরও অনেক সহজ হত ।
নিকোলাস ব্লেজেন

1
সিস্টেম ফাংশনগুলির উপর নির্ভর করার চেয়ে পিএইচপি সিস্টেম ফাংশন ব্যবহার করা ভাল।
স্লোয়ান থ্রেশার

গৃহীত উত্তরে জোর দেওয়া হিসাবে - দয়া করে ব্যবহারকারীর ইনপুটটি স্যানিটাইজ করুন, যে কেউ এই $_GETক্যোয়ারী স্ট্রিংয়ে কিছু যুক্ত করতে এবং systemকলটিতে নিজের কোডটি ইনজেক্ট করতে পারে
jg2703
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.