PHP के साथ एक फ़ाइल खोलना


198

मैं एक फ़ाइल खोलना चाहता हूं और यह ठीक काम करता है

system('unzip File.zip');

लेकिन मुझे URL के माध्यम से फ़ाइल नाम में पास होना चाहिए और इसे काम करने के लिए नहीं मिल सकता है, यही मेरे पास है।

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

मैं क्या खो रहा हूँ? मुझे पता है कि यह कुछ छोटा और बेवकूफ होना है जिसकी मैं अनदेखी कर रहा हूं।

धन्यवाद,


35
डबल उद्धरण चर का मूल्यांकन; एकल उद्धरण नहीं है। लेकिन - सावधान रहें, क्योंकि सिस्टम कॉल में कुछ इनपुट पास करना काफी खतरनाक हो सकता है।
वाइजगू

25
यह कहना चाहिए कि मुझे कुछ टिप्पणियों के शत्रुतापूर्ण स्वर पसंद नहीं हैं। यदि आप लोग महसूस करते हैं कि वह / वह बहुत याद कर रहा है, तो बस उसे इसके बारे में बताएं। हम सभी को कुछ न कुछ याद आता है।
सेबस्टियन मच

यहाँ त्रुटि सरल है। आप दोहरे उद्धरण चिह्नों के बजाय सरल उद्धरणों के साथ स्ट्रिंग प्रक्षेप का उपयोग करने का प्रयास कर रहे हैं। स्ट्रिंग इंटरपोलेशन सरल उद्धरण के साथ काम नहीं करता है क्योंकि यह स्ट्रिंग शाब्दिक के लिए उपयोग किया जाता है। इसलिए, system("unzip $master.zip");काम करने के लिए अपना कोड बदलना चाहिए।
असीर पज़

जवाबों:


500

मैं केवल यह मान सकता हूं कि आपका कोड ऑनलाइन कहीं ट्यूटोरियल से आया है? उस मामले में, अच्छी नौकरी इसे खुद से पता लगाने की कोशिश कर रही है। दूसरी ओर, यह तथ्य कि यह कोड वास्तव में कहीं ऑनलाइन प्रकाशित किया जा सकता है क्योंकि किसी फ़ाइल को अनज़िप करने का सही तरीका थोड़ा भयावह है।

PHP में संपीड़ित फ़ाइलों से निपटने के लिए अंतर्निहित एक्सटेंशन हैं। इसके लिए systemकॉल का उपयोग करने की कोई आवश्यकता नहीं होनी चाहिए । ZipArchiveडॉक्स एक विकल्प है।

$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 के बाद से हटा दिया गया है ... जो कि बहुत पहले एक reeeeally था। इसका उपयोग न करें। $_GETइसके बजाय सुपरग्लोबल का उपयोग करें ।

अंत में, एक $_GETचर के माध्यम से स्क्रिप्ट के लिए जो भी इनपुट पास किया गया है उसे स्वीकार करने के बारे में बहुत सावधान रहें ।

हमेशा SANITIZE USER INPUT।


अपडेट करें

आपकी टिप्पणी के अनुसार, ज़िप फ़ाइल को उसी निर्देशिका में निकालने का सबसे अच्छा तरीका जिसमें यह रहता है कि फ़ाइल के लिए कठिन रास्ता निर्धारित किया जाए और इसे विशेष रूप से उस स्थान पर निकाला जाए। तो, आप कर सकते हैं:

// 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('./');, हालांकि, ऐसा होने की संभावना नहीं है। एक बेहतर विकल्प ज़िप फ़ाइल के स्थान को फाइलसिस्टम में निर्धारित करना है और इसे वहां निकालना है। मैं अपना उत्तर प्रदर्शित करने के लिए अपडेट करूंगा।

यदि आपके पास ZipArchive क्लास उपलब्ध नहीं है तो क्या होगा? मैं बकवास होस्टिंग वाली साइट पर काम कर रहा हूं और मुझे वह Fatal error: Class 'ZipArchive' not foundत्रुटि मिलती है जो मैं इस स्क्रिप्ट को
आज़माता हूं

2
@CWSpear आप PHP के साथ बहुत अधिक किसी भी संपीड़ित / डीकंप्रेस संचालन करने के लिए अंतर्निहितzlib लाइब्रेरी की आवश्यकता करने जा रहे हैं । यहां तक ​​कि सिस्टम कॉल करने के लिए आपको अंतर्निहित लाइब्रेरी की आवश्यकता होगी। हालांकि यह एक बहुत ही सर्वव्यापी बात है, और यह नहीं है कि यह अपवाद है। यदि आप साझा होस्टिंग पर हैं, तो उन्हें आपके लिए इसे स्थापित करना चाहिए। अन्यथा, बस Google कुछ "जैसे कैसे PHP के लिए ज़िप कार्य समर्थन स्थापित करने के लिए"
rdlowrey

हाँ, यह बहुत सस्ती होस्टिंग है जैसा कि मुझे बताया गया है। वैसे भी, उत्तर के लिए धन्यवाद, यह जानना अच्छा है।
CWSpear

37

कृपया, इसे ऐसा न करें (सिस्टम कॉल का हिस्सा बनने के लिए GET var पास करना)। इसके बजाय 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 कुछ और होनी चाहिए" (दोहरे उद्धरण चिह्नों में)।


3
+1 उफ़, पांच मिनट बाद मूल रूप से एक ही जवाब देने से निपटने के लिए खेद है। आपको वहां नहीं देखा :)
rdlowrey

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

बस यह कोशिश करें कि आपका डेडिनेशनडियर रूट डीआईआर निकालने के लिए -DDDDDATIONDir निकालने या निकालने के लिए गंतव्य है ।

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

1
मैं प्रयोग किया जाता है yourDestinationDirके रूप में session_save_path() . DIRECTORY_SEPARATOR . "$name" . DIRECTORY_SEPARATOR जहां $nameसत्र फ़ोल्डर में अनज़िप करने के लिए लक्ष्य फ़ोल्डर है।
रामरतन गुप्ता

1
सिस्टम से निपटने या फ़ंक्शंस को निष्पादित करने में वास्तव में सावधान रहें जिसमें चर शामिल हैं! यह आपके सर्वर से हैकर को फ्री कमांड लाइन दे सकता है।
अधिकतम

@ maxime यह कैसे संभव है? कृपया समझाएं क्योंकि मुझे लगता है कि ऐसा करने से रोकने के उपाय के रूप में php। तथ्यों के साथ अपने दावों को वापस लें
सैमुअल क्वामे एंटवी

@SamuelKwameAntwi निष्पादन और सिस्टम php उपयोगकर्ता के साथ सिस्टम शेल को कॉल कर रहे हैं। इसलिए, यदि आपका उपयोगकर्ता www है, तो आप सभी यूनिक्स उपयोगकर्ता "www" कमांड लाइन पर कर सकते हैं, जिसमें फ़ाइलों या निर्देशिकाओं को हटाना शामिल है। यदि आपका php उपयोगकर्ता रूट है तो यह वास्तव में सबसे खराब है। आप इसके बारे में अधिक जानकारी वहां पा सकते हैं: 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 की अपनी एक इनबिल्ट क्लास है जिसका उपयोग किसी ज़िप फ़ाइल से सामग्री को हटाने या निकालने के लिए किया जा सकता है। वर्ग ZipArchive है। नीचे सरल और मूल PHP कोड है जो ज़िप फ़ाइल को निकालेगा और इसे एक विशिष्ट निर्देशिका में रखेगा:

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

स्रोत: PHP में ज़िप फ़ाइलों को अनज़िप या निकालने के लिए कैसे?


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
हालांकि यह उस समस्या को ठीक कर सकता है जो वह कर रहा था, अन्य उत्तरों पर एक नज़र डालें कि यह बुरी सलाह क्यों है।
राजद

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

URL कोड में फ़ाइल नाम के साथ PHP कोड का प्रयोग करें "नाम"

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

सरल PHP फ़ंक्शन अनज़िप करने के लिए। कृपया सुनिश्चित करें कि आपके सर्वर पर ज़िप एक्सटेंशन स्थापित है।

/**
 * 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
सिस्टम के कार्यों पर भरोसा करने की तुलना में PHP सिस्टम फ़ंक्शन का उपयोग करना बेहतर है।
स्लोन थ्रैशर

जैसा कि स्वीकार किए गए उत्तर में जोर दिया गया है - कृपया उपयोगकर्ता इनपुट को साफ करें, कोई भी इस $_GETक्वेरी स्ट्रिंग में कुछ भी जोड़ सकता है और systemकॉल के लिए अपना कोड इंजेक्ट कर सकता है
jg2703
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.