Upload mehrerer Dateien in PHP


122

Ich möchte mehrere Dateien hochladen und in einem Ordner speichern und den Pfad abrufen und in der Datenbank speichern ... Ein gutes Beispiel für das Hochladen mehrerer Dateien ...

Hinweis: Dateien können von jedem Typ sein ...



2
Hier ist ein gutes Beispiel, dem Sie folgen sollten: BEISPIEL
jini

@sarfraz Ich hatte ein Wochenende ... Gerade habe ich das Beispiel ausprobiert, es ist so einfach
udaya

@sarfraz Ich habe versucht, die <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </ td> aus einem zusätzlichen Klick zu generieren td> ist auf Klick hinzufügen, aber das Ergebnis wird nicht erreicht Kannst du meine neue Frage sehen
udaya

Antworten:


260

Ich weiß, dass dies ein alter Beitrag ist, aber eine weitere Erklärung könnte für jemanden nützlich sein, der versucht, mehrere Dateien hochzuladen ... Folgendes müssen Sie tun:

  • Der Eingabename muss als Array definiert werden, d. H. name="inputName[]"
  • Eingabeelement muss haben multiple="multiple"oder nurmultiple
  • Verwenden Sie in Ihrer PHP-Datei die Syntax "$_FILES['inputName']['param'][index]"
  • Stellen Sie sicher, dass Sie nach leeren Dateinamen und Pfaden suchen. Das Array enthält möglicherweise leere Zeichenfolgen . Verwenden Sie array_filter()vor dem Count.

Hier ist ein heruntergekommenes und schmutziges Beispiel (das nur den relevanten Code zeigt)

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

    }
  }
}

Hoffe das hilft!


1
Ich bin nicht sicher, ob <input type="file">das Attribut zulässig ist multiple- was wäre das erwartete Ergebnis? Browser, in dem mehrere Dateien ausgewählt werden können?
Sven

9
@Sven Ja, es wird in HTML5 unterstützt. Schauen Sie sich diesen Link an . Mein schlechtes Aussehen scheint, dass der IE dies nicht unterstützt. Geeze, unser Leben wäre so viel einfacher, wenn sich alle an die Standards halten würden. LOL
Andy Braham

7
@AndyBraham Das multipleAttribut des Eingabeelements ist boolesch, dh Sie geben keinen Wert an: <input name="upload[]" type="file" multiple /> Siehe HTML5-Spezifikation: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen

11
Erwähnenswert ist, dass der Benutzer alle Dateien gleichzeitig auswählen muss. Bei jedem weiteren Auswahlversuch wird die vorherige Auswahl abgebrochen.
Skippy le Grand Gourou

2
@AlienBishop ist hier nicht ganz richtig, multiple = "multiple" ist vollkommen in Ordnung und ist alternativ in den Spezifikationen enthalten.
Kojow7

38

Es können mehrere Dateien ausgewählt und dann mithilfe des
<input type='file' name='file[]' multiple>
PHP-Beispielskripts hochgeladen werden , das das Hochladen durchführt:

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

Die ausgewählten Dateien werden als Array mit empfangen

$_FILES['file']['name'][0]Speichern des Namens der ersten Datei.
$_FILES['file']['name'][1]Speichern des Namens der zweiten Datei.
und so weiter.


Gibt es eine Möglichkeit, mit JS auf die Dateipfade jeder Datei zuzugreifen, wenn mehrere Dateien hochgeladen werden? Zum Beispiel können Sie für einzelne Dateien einfach fileInput.value abfragen, aber ich habe festgestellt, dass fileInput.value bei Auswahl mehrerer Dateien immer noch nur einen Pfad ausgibt ...
oldboy

6

HTML

  1. erstellen Sie div mit id='dvFile';

  2. erstellen Sie ein button;

  3. onclick dieser Tastenaufruffunktion 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 
}

Auf diese Weise können Sie beliebig viele Dateien / Bilder hinzufügen und diese über ein PHP-Skript verarbeiten.


1
Ersetzen Sie dieses document.getElementById ("dvFile"). InnerHTML + = txt; mit $ ("#dvFile") .append (txt); es wird Ihren
Eigensinn

Diese Antwort ist obsolot (und meiner Meinung nach zu kompliziert für etwas so Einfaches). Eine korrekte Antwort finden Sie unter @ rjv's
Vladimir Nul

@VladimirNul Gibt es eine Möglichkeit, mit JS auf die Dateipfade jeder Datei zuzugreifen, wenn mehrere Dateien hochgeladen werden? Zum Beispiel können Sie für einzelne Dateien einfach abfragen fileInput.value, aber ich habe festgestellt, dass bei Auswahl mehrerer Dateien immer fileInput.valuenoch nur ein Pfad
ausgegeben

@Anthony es hört sich so an, als ob du das in Javascript machst, ich verstehe den Punkt nicht. Bitte überprüfen Sie die Antwort von rjv.
Vladimir Nul

5

Es unterscheidet sich nicht wesentlich vom Hochladen einer Datei - es $_FILESist ein Array, das alle hochgeladenen Dateien enthält.

Es gibt ein Kapitel im PHP-Handbuch: Hochladen mehrerer Dateien

Wenn Sie mehrere Datei-Uploads mit einfacher Auswahl auf Benutzerseite aktivieren möchten (mehrere Dateien gleichzeitig auswählen, anstatt Upload-Felder auszufüllen ), schauen Sie sich SWFUpload an . Es funktioniert anders als ein normales Formular zum Hochladen von Dateien und erfordert jedoch Flash. SWFUpload war zusammen mit Flash veraltet. Überprüfen Sie die anderen, neueren Antworten auf den jetzt korrekten Ansatz.


1
Diese Antwort ist obsolot. Eine korrekte Antwort finden Sie unter @ rjv's
Vladimir Nul

Wahr. Bearbeitet, um das widerzuspiegeln.
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>

Diese Antwort ist obsolot. Eine korrekte Antwort finden Sie unter @ rjv's
Vladimir Nul

4

Einfach ist, dass Sie einfach zuerst das Dateiarray zählen und dann in der while-Schleife dies ganz einfach tun können

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

Jetzt haben Sie die Gesamtzahl der Dateien richtig.

In while-Schleife machen Sie Folgendes:

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

1
Hier fehlt etwas, bitte schauen Sie sich die Antwort von @ rjv an.
Vladimir Nul

4

Dieses einfache Skript hat bei mir funktioniert.

<?php

foreach($_FILES as $file){
  //echo $file['name']; 
  echo $file['tmp_name'].'</br>'; 
  move_uploaded_file($file['tmp_name'], "./uploads/".$file["name"]);
}

?>

3

Hier ist eine Funktion, die ich geschrieben habe und die ein verständlicheres $_FILESArray zurückgibt .

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

Ich führe foreach-Schleife mit Fehlerelement aus

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

 }


0

Wir können einfach mehrere Dateien mit PHP hochladen, indem wir das folgende Skript verwenden.

Laden Sie den vollständigen Quellcode und die Vorschau herunter

<?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
Bitte überprüfen Sie diese URL, es wird nützlich sein, um Ihre Inhaltsqualität zu verbessern
Willie Cheng

0

Das hat bei mir funktioniert. Ich musste Dateien hochladen, Dateinamen speichern und ich hatte zusätzliche Informationen aus Eingabefeldern, die ebenfalls gespeichert werden sollten, und einen Datensatz pro mehreren Dateinamen. Ich habe serialize () verwendet und das dann zur SQL-Hauptabfrage hinzugefügt.

  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

Netter Link zu:

Hochladen von PHP-Einzeldateien mit unterschiedlichen grundlegenden Erklärungen .

Hochladen von PHP-Dateien mit der Validierung

Hochladen mehrerer PHP-Dateien mit Validierung Klicken Sie hier, um den Quellcode herunterzuladen

PHP / jQuery Mehrere Dateien mit ProgressBar und Validierung hochladen (Klicken Sie hier, um den Quellcode herunterzuladen)

So laden Sie Dateien in PHP hoch und speichern sie in der MySQL-Datenbank (Klicken Sie hier, um den Quellcode herunterzuladen)

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, ");
                }
            }

und Sie müssen Ihren HTML-Code überprüfen

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

Netter Link zu:

Hochladen von PHP-Einzeldateien mit unterschiedlichen grundlegenden Erklärungen .

Hochladen von PHP-Dateien mit der Validierung

Hochladen mehrerer PHP-Dateien mit Validierung Klicken Sie hier, um den Quellcode herunterzuladen

PHP / jQuery Mehrere Dateien mit ProgressBar und Validierung hochladen (Klicken Sie hier, um den Quellcode herunterzuladen)

So laden Sie Dateien in PHP hoch und speichern sie in der MySQL-Datenbank (Klicken Sie hier, um den Quellcode herunterzuladen)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.