อัปโหลดไฟล์หลายไฟล์ใน php


122

ฉันต้องการอัปโหลดไฟล์หลายไฟล์และเก็บไว้ในโฟลเดอร์และรับเส้นทางและจัดเก็บไว้ในฐานข้อมูล ... ตัวอย่างที่ดีที่คุณมองหาการอัปโหลดหลายไฟล์ ...

หมายเหตุ:ไฟล์สามารถเป็นประเภทใดก็ได้ ...



2
นี่คือตัวอย่างที่ดีสำหรับคุณที่จะปฏิบัติตาม: ตัวอย่าง
jini

@sarfraz ฉันมีวันหยุดสุดสัปดาห์ ... ตอนนี้ฉันลองใช้ตัวอย่างมันง่ายมาก
udaya

@sarfraz ฉันพยายามสร้าง <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> จากการคลิกเพิ่มฉันได้รับ < td> เมื่อคลิกเพิ่ม แต่ผลลัพธ์ไม่สำเร็จคุณเห็นคำถามใหม่ของฉันโพสต์
udaya

คำตอบ:


260

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คำอธิบายเพิ่มเติมบางอย่างอาจเป็นประโยชน์สำหรับผู้ที่พยายามอัปโหลดหลายไฟล์ ... นี่คือสิ่งที่คุณต้องทำ:

  • ต้องกำหนดชื่ออินพุตเป็นอาร์เรย์เช่น name="inputName[]"
  • องค์ประกอบอินพุตต้องมีmultiple="multiple"หรือเพียงmultiple
  • ในไฟล์ PHP ของคุณให้ใช้ไวยากรณ์ "$_FILES['inputName']['param'][index]"
  • ตรวจสอบให้แน่ใจที่จะมองหาชื่อไฟล์ที่ว่างเปล่าและเส้นทางอาร์เรย์อาจมีสตริงที่ว่างเปล่า ใช้array_filter()ก่อนนับ

นี่คือตัวอย่างที่ไม่ดีและสกปรก (แสดงเฉพาะรหัสที่เกี่ยวข้อง)

HTML:

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

PHP:

//$files = array_filter($_FILES['upload']['name']); //something like that to be used before processing files.

// Count # of uploaded files in array
$total = count($_FILES['upload']['name']);

// Loop through each file
for( $i=0 ; $i < $total ; $i++ ) {

  //Get the temp file path
  $tmpFilePath = $_FILES['upload']['tmp_name'][$i];

  //Make sure we have a file path
  if ($tmpFilePath != ""){
    //Setup our new file path
    $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];

    //Upload the file into the temp dir
    if(move_uploaded_file($tmpFilePath, $newFilePath)) {

      //Handle other code here

    }
  }
}

หวังว่านี่จะช่วยได้!


1
ฉันไม่แน่ใจว่า<input type="file">อนุญาตแอตทริบิวต์multiple- ผลลัพธ์ที่คาดหวังจะเป็นอย่างไร เบราว์เซอร์อนุญาตให้เลือกหลายไฟล์?
Sven

9
@Sven ใช่มันได้รับการสนับสนุนใน HTML5 ตรวจสอบลิงค์นี้ดูเหมือนว่า IE ไม่รองรับสิ่งนี้ ... Geeze ชีวิตของเราจะง่ายขึ้นมากถ้าทุกคนไปตามมาตรฐาน ... LOL
Andy Braham

7
@AndyBraham multipleแอตทริบิวต์ขององค์ประกอบอินพุตคือบูลีนซึ่งหมายความว่าคุณไม่ได้ระบุค่า: <input name="upload[]" type="file" multiple /> ดูข้อมูลจำเพาะ HTML5: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen

11
เป็นมูลค่าการกล่าวขวัญที่ผู้ใช้ต้องเลือกไฟล์ทั้งหมดในครั้งเดียว การพยายามเลือกเพิ่มเติมใด ๆ จะยกเลิกการเลือกก่อนหน้านี้
Skippy le Grand Gourou

2
@AlienBishop ไม่ถูกต้องที่นี่ multiple = "multiple" นั้นดีอย่างสมบูรณ์แบบและรวมอยู่ในข้อกำหนดเป็นทางเลือก
kojow7

38

สามารถเลือกไฟล์ได้หลายไฟล์จากนั้นอัปโหลดโดยใช้
<input type='file' name='file[]' multiple>
สคริปต์ php ตัวอย่างที่ทำการอัพโหลด:

<html>
<title>Upload</title>
<?php
    session_start();
    $target=$_POST['directory'];
        if($target[strlen($target)-1]!='/')
                $target=$target.'/';
            $count=0;
            foreach ($_FILES['file']['name'] as $filename) 
            {
                $temp=$target;
                $tmp=$_FILES['file']['tmp_name'][$count];
                $count=$count + 1;
                $temp=$temp.basename($filename);
                move_uploaded_file($tmp,$temp);
                $temp='';
                $tmp='';
            }
    header("location:../../views/upload.php");
?>
</html>

ไฟล์ที่เลือกจะได้รับเป็นอาร์เรย์ที่มี

$_FILES['file']['name'][0]จัดเก็บชื่อไฟล์แรก
$_FILES['file']['name'][1]จัดเก็บชื่อไฟล์ที่สอง
และอื่น ๆ


มีวิธีใดบ้างในการเข้าถึงเส้นทางไฟล์ของแต่ละไฟล์ด้วย JS เมื่ออัปโหลดหลายไฟล์ ตัวอย่างเช่นสำหรับไฟล์เดียวคุณสามารถค้นหา fileInput.value ได้ แต่ฉันสังเกตเห็นว่าเมื่อไฟล์หลายไฟล์ถูกเลือก fileInput.value ยังคงแสดงผลเพียงหนึ่งเส้นทาง ...
oldboy

6

HTML

  1. สร้าง div ด้วยid='dvFile';

  2. สร้างbutton;

  3. onclick ของฟังก์ชันการเรียกปุ่มนั้น add_more()

JavaScript

function  add_more() {
  var txt = "<br><input type=\"file\" name=\"item_file[]\">";
  document.getElementById("dvFile").innerHTML += txt;
}

PHP

if(count($_FILES["item_file"]['name'])>0)
 { 
//check if any file uploaded
 $GLOBALS['msg'] = ""; //initiate the global message
  for($j=0; $j < count($_FILES["item_file"]['name']); $j++)
 { //loop the uploaded file array
   $filen = $_FILES["item_file"]['name']["$j"]; //file name
   $path = 'uploads/'.$filen; //generate the destination path
   if(move_uploaded_file($_FILES["item_file"]['tmp_name']["$j"],$path)) 
{
   //upload the file
    $GLOBALS['msg'] .= "File# ".($j+1)." ($filen) uploaded successfully<br>";
    //Success message
   }
  }
 }
 else {
  $GLOBALS['msg'] = "No files found to upload"; //No file upload message 
}

ด้วยวิธีนี้คุณสามารถเพิ่มไฟล์ / รูปภาพได้มากเท่าที่ต้องการและจัดการผ่านสคริปต์ php


1
แทนที่ document.getElementById นี้ ("dvFile") innerHTML + = txt; ด้วย $ ("#dvFile") .append (txt); มันจะบันทึกไฟล์แนบของคุณ
Rahul rajoria

คำตอบนี้เป็นสิ่งที่น่าสังเกต (และซับซ้อนเกินไปสำหรับบางสิ่งที่เรียบง่ายในความคิดของฉัน) สำหรับคำตอบที่ถูกต้องโปรดดูที่ @ rjv's
Vladimir Nul

@VladimirNul มีวิธีใดบ้างในการเข้าถึงเส้นทางไฟล์ของแต่ละไฟล์ด้วย JS เมื่ออัปโหลดหลายไฟล์? ตัวอย่างเช่นสำหรับไฟล์เดียวคุณสามารถสอบถามfileInput.valueได้ แต่ฉันสังเกตเห็นว่าเมื่อเลือกไฟล์หลายไฟล์fileInput.valueยังคงส่งออกเพียงเส้นทางเดียว ...
oldboy

@ แอนโธนี่ดูเหมือนว่าคุณกำลังทำในจาวาสคริปต์ฉันไม่เห็นประเด็น โปรดตรวจสอบคำตอบของ rjv
Vladimir Nul

5

ไม่แตกต่างจากการอัปโหลดไฟล์เดียว - $_FILESคืออาร์เรย์ที่มีไฟล์ที่อัปโหลดทั้งหมด

คู่มือ PHP มีบทหนึ่ง: การอัปโหลดไฟล์หลายไฟล์

หากคุณต้องการเปิดใช้งานอัพโหลดไฟล์หลายกับการเลือกง่ายในตอนท้ายของผู้ใช้ (เลือกไฟล์หลายครั้งแทนการกรอกข้อมูลในเขตข้อมูลที่อัปโหลด) จะดูที่SWFUpload มันทำงานแตกต่างจากรูปแบบการอัปโหลดไฟล์ปกติและต้องใช้ Flash ในการทำงาน SWFUpload ล้าสมัยพร้อมกับ Flash ตรวจสอบคำตอบอื่น ๆ ที่ใหม่กว่าสำหรับแนวทางที่ถูกต้องในขณะนี้


1
คำตอบนี้คือ obsolote สำหรับคำตอบที่ถูกต้องโปรดดูที่ @ rjv's
Vladimir Nul

จริง แก้ไขเพื่อสะท้อนให้เห็นว่า
Pekka

4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
$max_no_img=4; // Maximum number of images value to be set here

echo "<form method=post action='' enctype='multipart/form-data'>";
echo "<table border='0' width='400' cellspacing='0' cellpadding='0' align=center>";
for($i=1; $i<=$max_no_img; $i++){
echo "<tr><td>Images $i</td><td>
<input type=file name='images[]' class='bginput'></td></tr>";
}

echo "<tr><td colspan=2 align=center><input type=submit value='Add Image'></td></tr>";
echo "</form> </table>";
while(list($key,$value) = each($_FILES['images']['name']))
{
    //echo $key;
    //echo "<br>";
    //echo $value;
    //echo "<br>";
if(!empty($value)){   // this will check if any blank field is entered
$filename =rand(1,100000).$value;    // filename stores the value

$filename=str_replace(" ","_",$filename);// Add _ inplace of blank space in file name, you can remove this line

$add = "upload/$filename";   // upload directory path is set
//echo $_FILES['images']['type'][$key];     // uncomment this line if you want to display the file type
//echo "<br>";                             // Display a line break
copy($_FILES['images']['tmp_name'][$key], $add); 
echo $add;
    //  upload the file to the server
chmod("$add",0777);                 // set permission to the file.
}
}
?>
</body>
</html>

คำตอบนี้คือ obsolote สำหรับคำตอบที่ถูกต้องโปรดดูที่ @ rjv's
Vladimir Nul

4

ง่ายๆก็คือเพียงแค่นับอาร์เรย์ไฟล์ก่อนจากนั้นในขณะที่วนซ้ำคุณสามารถทำได้อย่างง่ายดายเช่นนี้

$count = count($_FILES{'item_file']['name']);

ตอนนี้คุณมีจำนวนไฟล์ทั้งหมดแล้ว

ในขณะที่ลูปทำดังนี้:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}

1
มีบางอย่างหายไปที่นี่โปรดดูคำตอบของ @ rjv
Vladimir Nul


3

นี่คือฟังก์ชันที่ฉันเขียนซึ่งส่งคืน$_FILESอาร์เรย์ที่เข้าใจได้ง่ายขึ้น

function getMultiple_FILES() {
    $_FILE = array();
    foreach($_FILES as $name => $file) {
        foreach($file as $property => $keys) {
            foreach($keys as $key => $value) {
                $_FILE[$name][$key][$property] = $value;
            }
        }
    }
    return $_FILE;
}

2

ฉันเรียกใช้ foreach loop ด้วยองค์ประกอบข้อผิดพลาดดูเหมือนว่า

 foreach($_FILES['userfile']['error'] as $k=>$v)
 {
    $uploadfile = 'uploads/'. basename($_FILES['userfile']['name'][$k]);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'][$k], $uploadfile)) 
    {
        echo "File : ", $_FILES['userfile']['name'][$k] ," is valid, and was                      successfully uploaded.\n";
    }

    else 
    {
        echo "Possible file : ", $_FILES['userfile']['name'][$k], " upload attack!\n";
    }   

 }

1

เพิ่งเจอวิธีแก้ปัญหาต่อไปนี้:

http://www.mydailyhacks.org/2014/11/05/php-multifile-uploader-for-php-5-4-5-5/

มันเป็นสคริปต์การอัปโหลดไฟล์หลายไฟล์ของ PHP พร้อมแบบฟอร์มที่คุณสามารถเพิ่มอินพุตหลายรายการและแถบความคืบหน้า AJAX ควรใช้งานได้โดยตรงหลังจากคลายไฟล์บนเซิร์ฟเวอร์ ...


0

เราสามารถอัพโหลดไฟล์หลาย ๆ ไฟล์โดยใช้ php ได้อย่างง่ายดายโดยใช้สคริปต์ด้านล่าง

ดาวน์โหลดซอร์สโค้ดแบบเต็มและดูตัวอย่าง

<?php
if (isset($_POST['submit'])) {
    $j = 0; //Variable for indexing uploaded image 

 $target_path = "uploads/"; //Declaring Path for uploaded images
    for ($i = 0; $i < count($_FILES['file']['name']); $i++) {//loop to get individual element from the array

        $validextensions = array("jpeg", "jpg", "png");  //Extensions which are allowed
        $ext = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 
        $file_extension = end($ext); //store extensions in the variable

  $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext) - 1];//set the target path with a new name of image
        $j = $j + 1;//increment the number of uploaded images according to the files in array       

   if (($_FILES["file"]["size"][$i] < 100000) //Approx. 100kb files can be uploaded.
                && in_array($file_extension, $validextensions)) {
            if (move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) {//if file moved to uploads folder
                echo $j. ').<span id="noerror">Image uploaded successfully!.</span><br/><br/>';
            } else {//if file was not moved.
                echo $j. ').<span id="error">please try again!.</span><br/><br/>';
            }
        } else {//if file size and file type was incorrect.
            echo $j. ').<span id="error">***Invalid file Size or Type***</span><br/><br/>';
        }
    }
}
?>

0
$property_images = $_FILES['property_images']['name'];
    if(!empty($property_images))
    {
        for($up=0;$up<count($property_images);$up++)
        {
            move_uploaded_file($_FILES['property_images']['tmp_name'][$up],'../images/property_images/'.$_FILES['property_images']['name'][$up]);
        }
    }

1
โปรดตรวจสอบURLนี้เพื่อเพิ่มคุณภาพเนื้อหาของคุณ
Willie Cheng

0

นี่คือสิ่งที่ได้ผลสำหรับฉัน ฉันต้องอัปโหลดไฟล์เก็บชื่อไฟล์และฉันมี inof เพิ่มเติมจากช่องป้อนข้อมูลเพื่อจัดเก็บเช่นกันและหนึ่งระเบียนต่อชื่อไฟล์หลายชื่อ ฉันใช้ serialize () จากนั้นเพิ่มเข้าไปในแบบสอบถามหลักของ sql

  class addReminder extends dbconn {
    public function addNewReminder(){

           $this->exdate = $_POST['exdate'];
           $this->name = $_POST['name'];
           $this->category = $_POST['category'];
           $this->location = $_POST['location'];
           $this->notes = $_POST['notes'];



           try {

                     if(isset($_POST['submit'])){
                       $total = count($_FILES['fileUpload']['tmp_name']);
                       for($i=0;$i<$total;$i++){
                         $fileName = $_FILES['fileUpload']['name'][$i];
                         $ext = pathinfo($fileName, PATHINFO_EXTENSION);
                         $newFileName = md5(uniqid());
                         $fileDest = 'filesUploaded/'.$newFileName.'.'.$ext;
                         $justFileName = $newFileName.'.'.$ext;
                         if($ext === 'pdf' || 'jpeg' || 'JPG'){
                             move_uploaded_file($_FILES['fileUpload']['tmp_name'][$i], $fileDest);
                             $this->fileName = array($justFileName);
                             $this->encodedFileNames = serialize($this->fileName);
                             var_dump($this->encodedFileNames);
                         }else{
                           echo $fileName . ' Could not be uploaded. Pdfs and jpegs only please';
                         }
                       }

                    $sql = "INSERT INTO reminders (exdate, name, category, location, fileUpload, notes) VALUES (:exdate,:name,:category,:location,:fileName,:notes)";
                    $stmt = $this->connect()->prepare($sql);
                    $stmt->bindParam(':exdate', $this->exdate);
                    $stmt->bindParam(':name', $this->name);
                    $stmt->bindParam(':category', $this->category);
                    $stmt->bindParam(':location', $this->location);
                    $stmt->bindParam(':fileName', $this->encodedFileNames);
                    $stmt->bindParam(':notes', $this->notes);
                    $stmt->execute();
                  }

           }catch(PDOException $e){
             echo $e->getMessage();
           }
      }
    }

-1

ลิงก์ที่ดีใน:

PHP เดี่ยวอัปโหลดไฟล์ที่มีแตกต่างกันคำอธิบายขั้นพื้นฐาน

การอัปโหลดไฟล์ PHP ด้วยการตรวจสอบความถูกต้อง

การอัปโหลดไฟล์ PHP หลายไฟล์พร้อมการตรวจสอบความถูกต้องคลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ด

PHP / jQuery อัปโหลดไฟล์หลายไฟล์ด้วย ProgressBar และการตรวจสอบความถูกต้อง (คลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ด)

วิธีการอัพโหลดไฟล์ใน PHP และจัดเก็บในฐานข้อมูล MySql (คลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ด)

extract($_POST);
    $error=array();
    $extension=array("jpeg","jpg","png","gif");
    foreach($_FILES["files"]["tmp_name"] as $key=>$tmp_name)
            {
                $file_name=$_FILES["files"]["name"][$key];
                $file_tmp=$_FILES["files"]["tmp_name"][$key];
                $ext=pathinfo($file_name,PATHINFO_EXTENSION);
                if(in_array($ext,$extension))
                {
                    if(!file_exists("photo_gallery/".$txtGalleryName."/".$file_name))
                    {
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$file_name);
                    }
                    else
                    {
                        $filename=basename($file_name,$ext);
                        $newFileName=$filename.time().".".$ext;
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$newFileName);
                    }
                }
                else
                {
                    array_push($error,"$file_name, ");
                }
            }

และคุณต้องตรวจสอบโค้ด HTML ของคุณ

<form action="create_photo_gallery.php" method="post" enctype="multipart/form-data">
    <table width="100%">
        <tr>
            <td>Select Photo (one or multiple):</td>
            <td><input type="file" name="files[]" multiple/></td>
        </tr>
        <tr>
            <td colspan="2" align="center">Note: Supported image format: .jpeg, .jpg, .png, .gif</td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="Create Gallery" id="selectedButton"/></td>
        </tr>
    </table>
</form>

ลิงก์ที่ดีใน:

PHP เดี่ยวอัปโหลดไฟล์ที่มีแตกต่างกันคำอธิบายขั้นพื้นฐาน

การอัปโหลดไฟล์ PHP ด้วยการตรวจสอบความถูกต้อง

การอัปโหลดไฟล์ PHP หลายไฟล์พร้อมการตรวจสอบความถูกต้องคลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ด

PHP / jQuery อัปโหลดไฟล์หลายไฟล์ด้วย ProgressBar และการตรวจสอบความถูกต้อง (คลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ด)

วิธีการอัพโหลดไฟล์ใน PHP และจัดเก็บในฐานข้อมูล MySql (คลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.