এইচটিটিপি পোস্ট ব্যবহার করে আমি কীভাবে এইচটিএমএল এবং পিএইচপি দিয়ে একাধিক ফাইল নির্বাচন করতে এবং আপলোড করতে পারি?


154

একক ফাইল আপলোড ব্যবহার করে এটি করার অভিজ্ঞতা আমার আছে <input type="file">। তবে একবারে একাধিক আপলোড করতে আমার সমস্যা হচ্ছে।

উদাহরণস্বরূপ, আমি ইমেজগুলির একটি সিরিজ নির্বাচন করতে সক্ষম হতে চাই, তারপরে সেগুলি একবারে সার্ভারে আপলোড করুন।

যদি সম্ভব হয় তবে একক ফাইল ইনপুট নিয়ন্ত্রণ ব্যবহার করা দুর্দান্ত।

যে কেউ এই কাজ করা সম্ভব কিভাবে জানেন না? ধন্যবাদ!


2
আপনি কি বলতে চান যে ফাইল নির্বাচনকারী সংলাপে একাধিক ফাইল নির্বাচন করুন বা একাধিক ফাইল ইনপুট ব্যবহার করছেন?
মিটমারো

হাই, কোনও আর্কাইভ ফাইল আপলোড করা আপনার পক্ষে সম্ভব (জিপ, রার, টার, ...)?
উত্সরেবেল

উত্তর:


195

এটি HTML5 এ সম্ভব । উদাহরণ (পিএইচপি 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 টি আইটেম নির্বাচন করার পরে ক্রোমে এটি দেখতে কেমন তা এখানে দেখুন:

ক্রোম একাধিক ফাইল নির্বাচন করুন

এবং "আপলোড" বোতামটি ক্লিক করার পরে এটি দেখতে কেমন তা এখানে ক্লিক করুন।

পিএইচপি-তে একাধিক ফাইল জমা দেওয়া

এটি পুরোপুরি কার্যকারী উত্তরের একটি স্কেচ। পিএইচপি ম্যানুয়াল দেখুন: পিএইচপি- তে ফাইল আপলোডগুলি সঠিক, সুরক্ষিত পরিচালনা করার বিষয়ে আরও তথ্যের জন্য ফাইল আপলোডগুলি পরিচালনা করছে ling


8
এটি ডাব্লু 3 সি বৈধতা পাস করে, বা এটি হওয়া উচিত multiple="multiple"?
ভোলআরন

10
আমি বিশ্বাস করি এটি বৈধ: চিন্তাগুলি . com / html5- বুলিয়ান- কৃতিত্ব utes আপনি <! ডকটিপ এইচটিএমএল> যুক্ত করলে এটি ডাব্লু 3 সি বৈধকারীর পাস করে।
মার্ক ই। হাজেস

2
হ্যাঁ, এটি সম্ভবত এইচটিএমএলকে বৈধতা দেয় তবে এক্সএইচটিএমএল ব্যর্থ হয়। আমি এখনও এক্সএইচটিএমএল ব্যবহার করতে চাইলেও, আমি মনে করি লোকেরা আজকাল এ থেকে দূরে থাকার পরামর্শ দেয়।
ভলআরন

11
সম্পত্তির নাম (উদাঃ name="file[]") যোগ না করে এটি কাজ করে না । আমি উত্তরটি সম্পাদনা করার চেষ্টা করেছি , তবে তা প্রত্যাখ্যান করা হয়েছে।
মিশেল আইরেস

1
ধন্যবাদ @ মিশেল আইরেস, আমি আমার উত্তর আপডেট করেছি। আমি যখন প্রথমত এটি লিখেছিলাম তখন আমি কেবলমাত্র সমস্যার জন্য এইচটিএমএল অংশকে সম্বোধন করেছি খ / সি অন্যান্য উত্তর ছিল যা পিএইচপি অংশটি ব্যাখ্যা করেছিল। সময়ের সাথে সাথে, এটি একটি জনপ্রিয় উত্তর হয়ে উঠেছে, তাই আমি এখন এইচটিএমএল এবং পিএইচপি উভয়ই কভার করতে প্রসারিত করেছি।
মার্ক ই। হাজেস

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 গণনা () ব্যবহার করতে পারেন। গুডলাক উইদিত!


5
বখশিশের জন্য ধন্যবাদ! এটি আমাকে এত বেশি সময় বাঁচিয়ে +1
বিপিএম

এটি খুব সুন্দর কাজ করে ... তবে ইন্টারনেট এক্সপ্লোরার (ভি 8) এ এইভাবে আপলোড করতে আমার সমস্যা হচ্ছে। আমি মনে করি IE এইভাবে আপলোড করা সমর্থন করে না।
তারিক এম নাসিম

4
অথবা foreachআপলোড করা ফাইলগুলির সংখ্যা না জেনে আপনি বিবৃতি দিয়ে ফাইলগুলি লুপ করতে পারেন ...
ygesher

দ্রষ্টব্য, আপনি যদি এইচটিএমএলতে আপনার নামে একটি কী ব্যবহার করেন, যেমন নাম = "ফাইল [3]", তবে আপনাকে যদি access _FILES ['ফাইল'] ['tmp_name'] [3] এর মাধ্যমে মানটি প্রবেশ করতে হবে তবে ক্ষেত্রে এটা স্পষ্ট নয়।
মাইস্ট্রিম 21

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

3
যদিও এটি IE8 তে কাজ করেনি তবে কেবল একটি আসল ব্রাউজার ব্যবহার করুন।
দুর্ঘটনা

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

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

ir দির হ'ল ডিরেক্টরিটি যেখানে আপনি ছবিটি সংরক্ষণ করতে চান the ক্ষেত্রগুলি হল সেই ক্ষেত্রের নাম যা আপনি ডাটাবেসে সংরক্ষণ করতে চান

ডাটাবেস ক্ষেত্র অবশ্যই অ্যারে ফর্ম্যাট উদাহরণে থাকতে হবে যদি আপনার যদি ডাটাবেস চিত্রের দোকান এবং ক্ষেত্রের নাম আইডি, নাম, ঠিকানা থাকে তবে আপনার মতো ডেটা পোস্ট করতে হবে

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

// imageFunitions ক্লাস এখানে শেষ হয়

আপনি এটির এক্সটেনশন সহ একাধিক চিত্র সন্নিবেশ করানোর জন্য এই কোডটি চেষ্টা করতে পারেন এই ফাংশনটি চিত্র ফাইলগুলি পরীক্ষা করার জন্য তৈরি করা হয়েছে আপনি কোডটিতে পার্টিকুলার ফাইলগুলির জন্য এক্সটেনশন তালিকাটি প্রতিস্থাপন করতে পারেন


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

-1

আংশিক উত্তর: নাশপাতি HTTP_UPLOAD হতে পারে দরকারী http://pear.php.net/manual/en/package.http.http-upload.examples.php

একাধিক ফাইলের জন্য একটি সম্পূর্ণ উদাহরণ আছে


1
আপনি পিয়ার প্যাকেজটি ব্যবহার করতে পারেন তবে এই টাস্কটি মোটামুটি নগণ্য এবং যদি না আপনার প্যাকেজটি সরবরাহ করে এমন অতিরিক্ত বৈশিষ্ট্যগুলির প্রয়োজন হয় (আন্তর্জাতিকীকরণের ত্রুটি বার্তা, যাচাইকরণ ইত্যাদি ...) আমি দেশীয় পিএইচপি ফাংশন ব্যবহার করার পরামর্শ দেব। তবে এটি কেবল আমার মতামত। :)
মিটমারো

আমি আপনার সাথে একমত, তাই আমি "আংশিক উত্তর" লিখেছি। তবে আমি কোডটি পুনরায় ব্যবহার করার জন্য যথাসাধ্য চেষ্টা করি এবং আমি প্রায়শই নাশপাতি দিয়ে যতটা পারি পারি (পিয়ার
কোডারগুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.