Caricamento di più file in php


122

Voglio caricare più file e archiviarli in una cartella e ottenere il percorso e archiviarlo nel database ... Qualsiasi buon esempio che hai cercato per caricare più file ...

Nota: i file possono essere di qualsiasi tipo ...



2
Ecco un buon esempio da seguire: ESEMPIO
jini

@sarfraz Ho passato il fine settimana ... Proprio ora ho provato l'esempio è così facile
udaya

@sarfraz Ho provato a generare <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> da un clic aggiuntivo ho ottenuto il < td> è su aggiungi clic ma il risultato non è stato raggiunto Riesci a vedere la mia nuova domanda pubblicata
udaya

Risposte:


260

So che questo è un vecchio post, ma qualche ulteriore spiegazione potrebbe essere utile per qualcuno che cerca di caricare più file ... Ecco cosa devi fare:

  • Il nome dell'input deve essere definito come un array, ad es name="inputName[]"
  • L'elemento di input deve avere multiple="multiple"o solomultiple
  • Nel tuo file PHP usa la sintassi "$_FILES['inputName']['param'][index]"
  • Assicurati di cercare nomi di file e percorsi vuoti , l'array potrebbe contenere stringhe vuote . Utilizzare array_filter()prima del conteggio.

Ecco un esempio basso e sporco (che mostra solo il codice pertinente)

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

    }
  }
}

Spero che questo aiuti!


1
Non sono sicuro che <input type="file">consenta l'attributo multiple: quale sarebbe il risultato atteso? Browser che consente di selezionare più file?
Sven

9
@Sven Sì, è supportato in HTML5 dai un'occhiata a questo link , sembra che IE non lo supporti ... Accidenti la nostra vita sarebbe molto più facile se tutti rispettassero gli standard ... LOL
Andy Braham

7
@AndyBraham L' multipleattributo dell'elemento di input è booleano, il che significa che non gli fornisci un valore: <input name="upload[]" type="file" multiple /> vedi le specifiche HTML5: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen

11
Vale la pena ricordare che l'utente deve selezionare tutti i file contemporaneamente. Ogni ulteriore tentativo di selezione annullerà la selezione precedente.
Skippy le Grand Gourou

2
@AlienBishop non è del tutto corretto qui, multiple = "multiple" va benissimo ed è incluso nelle specifiche come alternativa.
kojow7

38

È possibile selezionare più file e quindi caricarli utilizzando lo
<input type='file' name='file[]' multiple>
script php di esempio che esegue il caricamento:

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

I file selezionati vengono ricevuti come un array con

$_FILES['file']['name'][0]memorizzare il nome del primo file.
$_FILES['file']['name'][1]memorizzare il nome del secondo file.
e così via.


c'è un modo per accedere ai percorsi dei file di ogni file con JS quando si caricano più file? ad esempio, per singoli file puoi semplicemente interrogare fileInput.value, ma ho notato che quando vengono selezionati più file fileInput.value restituisce ancora un solo percorso ...
oldboy

6

HTML

  1. creare div con id='dvFile';

  2. creare un button;

  3. onclick di quella funzione di chiamata del pulsante 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 
}

In questo modo puoi aggiungere file / immagini, quanti ne vuoi, e gestirli tramite script php.


1
Sostituisci questo document.getElementById ("dvFile"). InnerHTML + = txt; con $ ("#dvFile") .append (txt); salverà il tuo attaccamento
Rahul rajoria

Questa risposta è obsoleta (e troppo complicata per qualcosa di così semplice, secondo me). Per una risposta corretta, dai un'occhiata a @ rjv's
Vladimir Nul

@VladimirNul c'è un modo per accedere ai percorsi dei file di ogni file con JS durante il caricamento di più file? ad esempio, per singoli file puoi semplicemente eseguire una query fileInput.value, ma ho notato che quando vengono selezionati più file viene fileInput.valuecomunque visualizzato un solo percorso ...
oldboy

@ Anthony sembra che tu lo stia facendo in javascript, non vedo il punto. Si prega di controllare la risposta di rjv.
Vladimir Nul

5

Non è così diverso dal caricare un file: $_FILESè un array contenente tutti i file caricati.

C'è un capitolo nel manuale PHP: Caricamento di più file

Se desideri abilitare più caricamenti di file con una facile selezione da parte dell'utente (selezionando più file contemporaneamente invece di compilare i campi di caricamento) dai un'occhiata a SWFUpload . Funziona in modo diverso da un normale modulo di caricamento di file e richiede che Flash funzioni. SWFUpload era obsoleto insieme a Flash. Controlla le altre risposte più recenti per l'approccio ora corretto.


1
Questa risposta è obsoleta. Per una risposta corretta, dai un'occhiata a @ rjv's
Vladimir Nul

Vero. Modificato per riflettere questo.
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>

Questa risposta è obsoleta. Per una risposta corretta, dai un'occhiata a @ rjv's
Vladimir Nul

4

Semplice è che, conta prima l'array dei file, poi nel ciclo while puoi farlo facilmente

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

ora hai il numero totale di file corretto.

Nel ciclo while fai così:

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

1
Manca qualcosa qui, per favore dai un'occhiata alla risposta di @ rjv.
Vladimir Nul

4

questo semplice script ha funzionato per me.

<?php

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

?>

3

Ecco una funzione che ho scritto che restituisce un $_FILESarray più comprensibile .

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

Eseguo foreach loop con elemento di errore, assomiglia a

 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

Possiamo facilmente caricare più file utilizzando php utilizzando lo script seguente.

Scarica il codice sorgente completo e visualizza l'anteprima

<?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
Controlla questo URL , ti sarà utile per aumentare la qualità dei tuoi contenuti
Willie Cheng

0

Questo è ciò che ha funzionato per me. Ho dovuto caricare file, memorizzare i nomi dei file e ho avuto ulteriori informazioni dai campi di input da memorizzare e un record per più nomi di file. Ho usato serialize () e poi l'ho aggiunto alla query sql principale.

  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

Bel link su:

Caricamento di un singolo file PHP con varie spiegazioni di base .

Caricamento di file PHP con Validation

Caricamento di più file PHP con convalida Fare clic qui per scaricare il codice sorgente

Caricamento di più file PHP / jQuery con ProgressBar e convalida (fare clic qui per scaricare il codice sorgente)

Come caricare file in PHP e archiviarli nel database MySql (fare clic qui per scaricare il codice sorgente)

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

e devi controllare il tuo codice 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>

Bel link su:

Caricamento di un singolo file PHP con varie spiegazioni di base .

Caricamento di file PHP con Validation

Caricamento di più file PHP con convalida Fare clic qui per scaricare il codice sorgente

Caricamento di più file PHP / jQuery con ProgressBar e convalida (fare clic qui per scaricare il codice sorgente)

Come caricare file in PHP e archiviarli nel database MySql (fare clic qui per scaricare il codice sorgente)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.