मैं HTTP POST का उपयोग करके HTML और PHP के साथ कई फ़ाइलों को कैसे चुन और अपलोड कर सकता हूँ?


155

मुझे इसका उपयोग करके एकल फ़ाइल अपलोड के साथ अनुभव है <input type="file">। हालाँकि, मुझे एक बार में एक से अधिक अपलोड करने में समस्या हो रही है।

उदाहरण के लिए, मैं छवियों की एक श्रृंखला का चयन करने में सक्षम होना चाहता हूं, फिर उन्हें सर्वर पर अपलोड करें, एक ही बार में।

यदि संभव हो तो एकल फ़ाइल इनपुट नियंत्रण का उपयोग करना बहुत अच्छा होगा।

क्या किसी को पता है कि यह कैसे पूरा करने के लिए? धन्यवाद!


2
क्या आपका मतलब है फ़ाइल चयनकर्ता संवाद में एक फ़ाइल का चयन करें या एकाधिक फ़ाइल इनपुट का उपयोग कर?
मितमरो जूल

नमस्ते, एक संग्रह फ़ाइल (ज़िप, आरएआर, टार, ...) अपलोड करना संभव है?
सार्करेबेल्स 11

जवाबों:


196

यह HTML5 में संभव है । उदाहरण (PHP 5.4):

<!doctype html>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="my_file[]" multiple>
            <input type="submit" value="Upload">
        </form>
        <?php
            if (isset($_FILES['my_file'])) {
                $myFile = $_FILES['my_file'];
                $fileCount = count($myFile["name"]);

                for ($i = 0; $i < $fileCount; $i++) {
                    ?>
                        <p>File #<?= $i+1 ?>:</p>
                        <p>
                            Name: <?= $myFile["name"][$i] ?><br>
                            Temporary file: <?= $myFile["tmp_name"][$i] ?><br>
                            Type: <?= $myFile["type"][$i] ?><br>
                            Size: <?= $myFile["size"][$i] ?><br>
                            Error: <?= $myFile["error"][$i] ?><br>
                        </p>
                    <?php
                }
            }
        ?>
    </body>
</html>

फ़ाइल संवाद में 2 आइटमों का चयन करने के बाद Chrome में यह कैसा दिखता है:

क्रोम कई फ़ाइल का चयन करें

और यहां "अपलोड" बटन पर क्लिक करने के बाद यह कैसा दिखता है।

कई फ़ाइलों को PHP में सबमिट करना

यह पूरी तरह से काम कर रहे जवाब का सिर्फ एक स्केच है। PHP मैनुअल देखें : PHP में फ़ाइल अपलोड की उचित, सुरक्षित हैंडलिंग के बारे में अधिक जानकारी के लिए फ़ाइल अपलोड को संभालना।


8
क्या यह w3c सत्यापन पास करता है, या यह होना चाहिए multiple="multiple"?
187 पर vol7ron

10
मेरा मानना ​​है कि यह मान्य है: विचार-विमर्श . com / html5-boolean-attributes । यदि आप जोड़ते हैं तो यह w3c सत्यापनकर्ता को पास करता है <! Doctype html>।
मार्क ई। हासे

2
हाँ, यह शायद HTML को मान्य करता है, लेकिन XHTML को विफल करता है। भले ही मैं अभी भी एक्सएचटीएमएल का उपयोग करना पसंद करता हूं, मुझे लगता है कि लोग इन दिनों इससे दूर रहने की सलाह देते हैं।
Vol7ron

11
यह संपत्ति के नाम (जैसे name="file[]") को जोड़े बिना काम नहीं करता था । मैंने उत्तर को संपादित करने का प्रयास किया , लेकिन यह अस्वीकार हो गया।
मिशेल एरेस

1
धन्यवाद @MichelAyres, मैंने अपना उत्तर अपडेट कर दिया है। जब मैंने इसे मौखिक रूप से लिखा था, तो मैंने केवल समस्या के HTML भाग को संबोधित किया b / c वहाँ अन्य उत्तर थे जिन्होंने PHP भाग को समझाया। समय के साथ, यह एक लोकप्रिय उत्तर बन गया, इसलिए मैंने अब HTML और PHP दोनों को कवर करने के लिए विस्तार किया है।
मार्क ई। हासे

94

वहाँ कई चीजें हैं जो आप कई फ़ाइल अपलोड बनाने के लिए करने की आवश्यकता है, वास्तव में बहुत सुंदर है। आपको जावा, अजाक्स, फ्लैश का उपयोग करने की आवश्यकता नहीं है। बस एक सामान्य फ़ाइल अपलोड फ़ॉर्म बनाना शुरू करें:

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

फिर सफलता की कुंजी;

<input type="file" name="file[]" multiple />

उन कोष्ठक मत भूलना! Post_upload.php में निम्नलिखित प्रयास करें:

<?php print_r($_FILES['file']['tmp_name']); ?>

ध्यान दें कि आपको tmp_name डेटा के साथ एक सरणी मिलती है, जिसका अर्थ है कि आप प्रत्येक फ़ाइल को 'नंबर' उदाहरण के साथ ब्रैकेट की तीसरी जोड़ी के साथ एक्सेस कर सकते हैं:

$_FILES['file']['tmp_name'][0]

आपके द्वारा चुनी गई फ़ाइलों की संख्या की गणना करने के लिए आप php count () का उपयोग कर सकते हैं। गुडलक विदित!


5
पारितोषिक के लिए धन्यवाद! इसने मुझे इतना समय बचा दिया +1
BPm

यह बहुत अच्छा काम करता है ... लेकिन मुझे इंटरनेट एक्सप्लोरर (v8) में इस तरह से अपलोड करने में परेशानी हो रही है। मुझे लगता है कि IE इस तरह से अपलोड करने का समर्थन नहीं करता है।
तारिक एम नसीम

4
या आप foreachअपलोड किए गए फाइलों की संख्या जानने के बिना, एक बयान के साथ फाइलों के माध्यम से लूप कर सकते हैं ...
ygesher

ध्यान दें, यदि आप अपने html में अपने नाम की एक कुंजी का उपयोग करते हैं, उदाहरण के लिए नाम = "फ़ाइल [3]", तो आपको $ _FILES ['फ़ाइल'] ['tmp_name'] [3] के मामले में मूल्य तक पहुंचने की आवश्यकता है यह स्पष्ट नहीं है।
MyStream

8

फ़ायरफ़ॉक्स 5 में पूर्ण समाधान:

<html>
<head>
</head>
<body>
 <form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" >
  <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> 
 </form>

<?php
echo "No. files uploaded : ".count($_FILES['infile']['name'])."<br>"; 


$uploadDir = "images/";
for ($i = 0; $i < count($_FILES['infile']['name']); $i++) {

 echo "File names : ".$_FILES['infile']['name'][$i]."<br>";
 $ext = substr(strrchr($_FILES['infile']['name'][$i], "."), 1); 

 // generate a random new file name to avoid name conflict
 $fPath = md5(rand() * time()) . ".$ext";

 echo "File paths : ".$_FILES['infile']['tmp_name'][$i]."<br>";
 $result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath);

 if (strlen($ext) > 0){
  echo "Uploaded ". $fPath ." succefully. <br>";
 }
}
echo "Upload complete.<br>";
?>

</body>
</html>

कोड काटा गया। यहाँ क्या इसके ऊपर आता है: <html> <head> </head> <body> <form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" > <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> </form>
टैप करता है

3
यह IE8 में काम नहीं किया था, लेकिन फिर एक असली ब्राउज़र का उपयोग करें।
Thaps

5

यदि आप फ़ाइल चयनकर्ता संवाद से कई फ़ाइलों का चयन करना चाहते हैं जो ब्राउज़ करते समय प्रदर्शित करते हैं तो आप ज्यादातर भाग्य से बाहर हैं। आपको एक जावा एप्लेट या कुछ इसी तरह का उपयोग करने की आवश्यकता होगी (मुझे लगता है कि एक है जो एक छोटी फ्लैश फ़ाइल का उपयोग करता है, मुझे लगता है कि मुझे पता चलेगा तो मैं अपडेट करूंगा)। वर्तमान में एकल फ़ाइल इनपुट केवल एकल फ़ाइल के चयन की अनुमति देता है।

यदि आप कई फ़ाइल इनपुट का उपयोग करने के बारे में बात कर रहे हैं तो एक का उपयोग करने से बहुत अंतर नहीं होना चाहिए। कुछ कोड पोस्ट करें और मैं आगे मदद करने की कोशिश करूंगा।


अद्यतन: एक एकल 'ब्राउज' बटन का उपयोग करने की एक विधि है जो फ्लैश का उपयोग करती है। मैंने कभी भी व्यक्तिगत रूप से इसका उपयोग नहीं किया है लेकिन मैंने इसके बारे में एक उचित राशि पढ़ी है। मुझे लगता है कि यह आपका सबसे अच्छा शॉट है।

http://swfupload.org/


1
मैंने फ्लैश आधारित कई अपलोडर से लिंक जोड़ा।
मितमरो जूल

मैंने swfupload fwiw का उपयोग किया है - यह अवसरों पर थोड़ा सा दर्द होता है, लेकिन वास्तव में यह मुश्किल नहीं है कि काम करना मुश्किल है।
Meep3D

@ बर्सोम सही है। पिछले कुछ वर्षों में कई फ़ाइल अपलोड पर चीजें बेहतर हुई हैं। : डी
मितमरो

4

पहले में आपको इस तरह से फॉर्म बनाना चाहिए:

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 

यह सही है । अब इस कोड को अपने फॉर्म कोड के तहत या अपने पसंद के किसी भी पेज पर जोड़ें

<?php
if(isset($_POST['ok']))
   foreach ($_FILES['file']['name'] as $filename) {
    echo $filename.'<br/>';
}
?>

यह आसान है ... समाप्त करें


1

यदि आप कई इनपुट फ़ील्ड का उपयोग करते हैं तो आप नाम = "फ़ाइल []" (या किसी अन्य नाम) को सेट कर सकते हैं। जब आप उन्हें अपलोड करेंगे तो उन्हें एक सरणी में रखा जाएगा ( $_FILES['file'] = array ({file_array},{file_array]..))


1
<form action="" method="POST" enctype="multipart/form-data">
  Select image to upload:
  <input type="file"   name="file[]" multiple/>
  <input type="submit" name="submit" value="Upload Image" />
</form>

लूप का उपयोग करना

<?php    
  $file_dir  = "uploads";    
  if (isset($_POST["submit"])) {

    for ($x = 0; $x < count($_FILES['file']['name']); $x++) {               

      $file_name   = $_FILES['file']['name'][$x];
      $file_tmp    = $_FILES['file']['tmp_name'][$x];

      /* location file save */
      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }    
?>

फॉरेप लूप का उपयोग करना

<?php
  $file_dir  = "uploads";    
  if (isset($_POST["submit"])) {

    foreach ($_FILES['file']['name'] as $key => $value) {                   

      $file_name   = $_FILES['file']['name'][$key];
      $file_tmp    = $_FILES['file']['tmp_name'][$key];

      /* location file save */
      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }
?>

0

मैंने एक php फ़ंक्शन बनाया है जिसका उपयोग कई छवियों को अपलोड करने के लिए किया जाता है, यह फ़ंक्शन विशिष्ट फ़ोल्डर में कई छवियों को अपलोड कर सकता है और साथ ही यह डेटाबेस में रिकॉर्ड को सहेज सकता है निम्नलिखित कोड $ अरिमेजेज छवियों का सरणी है जो फॉर्म नोट के माध्यम से भेजा जाता है यह अपलोड को एकाधिक का उपयोग करने की अनुमति नहीं देगा, लेकिन आपको एक ही नाम के साथ अलग-अलग इनपुट फ़ील्ड बनाने की आवश्यकता होगी क्योंकि आप बटन क्लिक पर फ़ाइल विवाद के डायनामिक ऐड फ़ील्ड सेट कर सकते हैं।

$ dir वह निर्देशिका है जिसमें आप छवि को सहेजना चाहते हैं $ फ़ील्ड उस फ़ील्ड का नाम है जिसे आप डेटाबेस में संग्रहीत करना चाहते हैं

डेटाबेस फ़ील्ड सरणी स्वरूपित उदाहरण में होना चाहिए यदि आपके पास डेटाबेस इमेजस्टोर और फ़ील्ड नाम जैसे आईडी, नाम, पता है तो आपको डेटा पोस्ट करने की आवश्यकता है

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']);

और फिर उस फील्ड को फंक्शन $ फील्ड में पास करें

$ तालिका उस तालिका का नाम है जिसमें आप डेटा संग्रहीत करना चाहते हैं।

function multipleImageUpload($arrayimage,$dir,$fields,$table)
{
    //extracting extension of uploaded file
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $arrayimage["name"]);
    $extension = end($temp);

    //validating image
    if ((($arrayimage["type"] == "image/gif")
    || ($arrayimage["type"] == "image/jpeg")
    || ($arrayimage["type"] == "image/jpg")
    || ($arrayimage["type"] == "image/pjpeg")
    || ($arrayimage["type"] == "image/x-png")
    || ($arrayimage["type"] == "image/png"))

    //check image size

    && ($arrayimage["size"] < 20000000)

    //check iamge extension in above created extension array
    && in_array($extension, $allowedExts)) 
    {
        if ($arrayimage["error"] > 0) 
        {
            echo "Error: " . $arrayimage["error"] . "<br>";
        } 
        else 
        {
            echo "Upload: " . $arrayimage["name"] . "<br>";
            echo "Type: " . $arrayimage["type"] . "<br>";
            echo "Size: " . ($arrayimage["size"] / 1024) . " kB<br>";
            echo "Stored in: ".$arrayimage['tmp_name']."<br>";

            //check if file is exist in folder of not
            if (file_exists($dir."/".$arrayimage["name"])) 
            {
                echo $arrayimage['name'] . " already exists. ";
            } 
            else 
            {
                //extracting database fields and value
                foreach($fields as $key=>$val)
                {
                    $f[]=$key;
                    $v[]=$val;
                    $fi=implode(",",$f);
                    $value=implode("','",$v);
                }
                //dynamic sql for inserting data into any table
                $sql="INSERT INTO " . $table ."(".$fi.") VALUES ('".$value."')";
                //echo $sql;
                $imginsquery=mysql_query($sql);
                move_uploaded_file($arrayimage["tmp_name"],$dir."/".$arrayimage['name']);
                echo "<br> Stored in: " .$dir ."/ Folder <br>";

            }
        }
    } 
    //if file not match with extension
    else 
    {
        echo "Invalid file";
    }
}
//function imageUpload ends here
}

// imageFunctions वर्ग यहाँ समाप्त होता है

आप इस कोड को उसके विस्तार के साथ कई छवियों को सम्मिलित करने के लिए कोशिश कर सकते हैं यह फ़ंक्शन छवि फ़ाइलों की जांच के लिए बनाया गया है आप कोड में पर्टिकुलर फ़ाइलों के लिए एक्सटेंशन सूची को बदल सकते हैं


हाय सब, मैं एक ऑटोजेनरेटेड ईमेल में दस्तावेजों को संलग्न करने के लिए फ़ाइल इनपुट का उपयोग करता हूं। मैं एक बार में कई दस्तावेज़ों को संलग्न करने में सक्षम हूं, हालांकि, मैं विभिन्न निर्देशिकाओं से कई दस्तावेज़ संलग्न करना चाहूंगा। वर्तमान में यदि मैं ऐसा करता हूं तो मेरा वर्तमान में चयनित दस्तावेज़ मेरे द्वारा चुने गए नए दस्तावेज़ से बदल दिया गया है। कृपया मैं इस बारे में कैसे जाऊं। धन्यवाद
कुनबी

-1

आंशिक उत्तर: नाशपाती HTTP_UPLOAD उपयोगी हो सकता है http://pear.php.net/manual/en/package.http.http-upload.examples.php

कई फ़ाइलों के लिए एक पूर्ण उदाहरण है


1
आप PEAR पैकेज का उपयोग कर सकते हैं लेकिन यह कार्य काफी तुच्छ है और जब तक आपको अतिरिक्त सुविधाओं की आवश्यकता नहीं होती है जो पैकेज प्रदान करता है (अंतर्राष्ट्रीय त्रुटि संदेश, सत्यापन, आदि ...) मैं मूल PHP फ़ंक्शन का उपयोग करने की सलाह दूंगा। लेकिन यह केवल मेरी राय है। :)
मिटमरो

मैं आपसे सहमत हूँ, इसीलिए मैंने "आंशिक उत्तर" लिखा। लेकिन मैं कोड का फिर से उपयोग करने की भी पूरी कोशिश करता हूं और मैं अक्सर उतना ही काम करता हूं जितना मैं नाशपाती के साथ कर सकता हूं (नाशपाती कोडर मेरे मुकाबले बहुत बेहतर है :
डैमको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.