PHP'de çoklu dosya yükleme


122

Birden çok dosya yüklemek ve bunları bir klasörde depolamak ve yolunu almak ve veritabanında saklamak istiyorum ... Birden çok dosya yükleme yapmak için aradığınız iyi bir örnek ...

Not: Dosyalar herhangi bir türde olabilir ...



2
İşte takip etmeniz için iyi bir örnek: ÖRNEK
jini

@sarfraz Haftasonu geçirdim ... Az önce örneği denedim çok kolay
udaya

@sarfraz <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> 'yi aldığım bir ekleme tıklamasından oluşturmaya çalıştım < td> ekleme tıklamasında ancak sonuca ulaşılmadı Yeni sorumun yayınlandığını görebiliyor musunuz
udaya

Yanıtlar:


260

Bunun eski bir gönderi olduğunu biliyorum, ancak birden fazla dosya yüklemeye çalışan biri için daha fazla açıklama yararlı olabilir ... Yapmanız gerekenler:

  • Giriş adı, yani bir dizi olarak tanımlanmalıdır name="inputName[]"
  • Giriş öğesinin sahip olması multiple="multiple"veya yalnızcamultiple
  • PHP dosyanızda sözdizimini kullanın "$_FILES['inputName']['param'][index]"
  • Boş dosya adlarını ve yollarını aradığınızdan emin olun , dizi boş dizeler içerebilir . Saymadan array_filter()önce kullanın .

İşte kötü ve kirli bir örnek (sadece ilgili kodu gösteren)

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

    }
  }
}

Umarım bu yardımcı olur!


1
Özelliğe <input type="file">izin verdiğinden emin değilim multiple- beklenen sonuç ne olurdu? Birden fazla dosyanın seçilmesine izin veren tarayıcı?
Sven

9
@Sven Evet HTML5'te destekleniyor bu bağlantıya bakın , IE bunu desteklemiyor gibi kötü görünüyorum ... Herkes standartlara uysaydı hayatımız çok daha kolay olurdu ... LOL
Andy Braham

7
@AndyBraham multipleGirdi öğesinin niteliği boole'dir , yani ona bir değer sağlamazsınız<input name="upload[]" type="file" multiple /> : HTML5 spesifikasyonuna bakın: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen

11
Kullanıcının tüm dosyaları aynı anda seçmesi gerektiğini belirtmekte fayda var. Başka herhangi bir seçim denemesi, önceki seçimi iptal edecektir.
Skippy le Grand Gourou

2
@AlienBishop burada tam olarak doğru değil, multiple = "multiple" tamamen iyi ve alternatif olarak spesifikasyonlara dahil edildi.
kojow7

38

Birden çok dosya seçilebilir ve ardından
<input type='file' name='file[]' multiple>
karşıya yüklemeyi yapan örnek php komut dosyası kullanılarak yüklenebilir:

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

Seçilen dosyalar bir dizi olarak alınır.

$_FILES['file']['name'][0]ilk dosyanın adını saklamak.
$_FILES['file']['name'][1]ikinci dosyanın adını saklamak.
ve bunun gibi.


Birden fazla dosya yüklerken JS ile her dosyanın dosya yollarına erişmenin bir yolu var mı? Örneğin, tek dosyalar için sadece sorgu fileInput.value, ama birden fazla dosya fileInput.value seçildiğinde hala sadece ... bir yolunu çıkarır fark ettik edebilirsiniz
oldboy

6

HTML

  1. ile div oluştur id='dvFile';

  2. oluşturmak button;

  3. onclick bu düğme çağırma işlevi 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 
}

Bu şekilde, gerektiği kadar dosya / resim ekleyebilir ve bunları php betiği aracılığıyla işleyebilirsiniz.


1
Bu document.getElementById ("dvFile") ile değiştirin. İnnerHTML + = txt; ile $ ( "#dvFile") .Append (txt); ekinizi kaydedecek
Rahul rajoria

Bu cevap obsolote (ve bence bu kadar basit bir şey için çok karmaşık). Doğru cevap için @ rjv's
Vladimir Nul

@VladimirNul, birden fazla dosya yüklerken JS ile her dosyanın dosya yollarına erişmenin bir yolu var mı? örneğin, tek dosyalar için basitçe sorgulayabilirsiniz fileInput.value, ancak birden fazla dosya seçildiğinde fileInput.valuehala yalnızca bir yol çıktı verdiğini fark ettim ...
yaşlı çocuk

@Anthony bunu javascript'te yapıyormuşsun gibi geliyor, noktayı anlamıyorum. Lütfen rjv'nin cevabını kontrol edin.
Vladimir Nul

5

Bir dosya yüklemekten o kadar da farklı değil - $_FILESyüklenen tüm dosyaları içeren bir dizidir.

PHP kılavuzunda bir bölüm var: Birden çok dosyanın yüklenmesi

Kullanıcı tarafında kolay seçimle birden çok dosya yüklemesini etkinleştirmek istiyorsanız (yükleme alanlarını doldurmak yerine aynı anda birden çok dosya seçmek) SWFUpload'a bir göz atın . Normal bir dosya yükleme formundan farklı çalışır ve yine de Flash'ın çalışması gerekir. SWFUpload, Flash ile birlikte kullanımdan kaldırıldı. Şimdi doğru olan yaklaşım için diğer, daha yeni cevapları kontrol edin.


1
Bu cevap obsolote. Doğru cevap için @ rjv's
Vladimir

Doğru. Bunu yansıtmak için düzenlendi.
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>

Bu cevap obsolote. Doğru cevap için @ rjv's
Vladimir

4

Basittir, önce dosyalar dizisini sayın, ardından while döngüsünde bunu şu şekilde kolayca yapabilirsiniz:

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

şimdi doğru toplam dosya sayısı elde ettiniz.

In while döngüsü böyle yapın:

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

1
Burada eksik bir şey var, lütfen @ rjv'nin cevabına bir göz atın.
Vladimir Nul

4

bu basit senaryo benim için çalıştı.

<?php

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

?>

3

İşte yazdığım ve daha anlaşılır bir $_FILESdizi döndüren bir fonksiyon .

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 döngüsünü hata öğesi ile çalıştırıyorum, şuna benziyor

 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

Aşağıdaki komut dosyasını kullanarak birden fazla dosyayı php kullanarak kolayca yükleyebiliriz.

Tam Kaynak kodunu indirin ve önizleyin

<?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
Lütfen bu URL'yi kontrol edin , içerik kalitenizi yükseltmek faydalı olacaktır
Willie Cheng

0

Bu benim için çalıştı. Dosyaları yüklemem, dosya adlarını saklamam gerekiyordu ve depolamak için girdi alanlarından ek bilgi ve birden çok dosya adı için bir kayıt vardı. Serialize () kullandım ve bunu ana sql sorgusuna ekledim.

  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

Güzel bağlantı:

Çeşitli temel açıklamalarla PHP Tek Dosya Yükleme .

Doğrulama ile PHP dosyası yükleme

Doğrulamalı PHP Çoklu Dosya Yükleme Kaynak kodunu indirmek için burayı tıklayın

PHP / jQuery ProgressBar ve Doğrulama ile Çoklu Dosya Yükleme (Kaynak kodunu indirmek için burayı tıklayın)

PHP'ye Nasıl Dosya Yüklenir ve MySql Veritabanında Nasıl Saklanır (Kaynak kodunu indirmek için buraya tıklayın)

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

ve HTML kodunuzu kontrol etmelisiniz

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

Güzel bağlantı:

Çeşitli temel açıklamalarla PHP Tek Dosya Yükleme .

Doğrulama ile PHP dosyası yükleme

Doğrulamalı PHP Çoklu Dosya Yükleme Kaynak kodunu indirmek için burayı tıklayın

PHP / jQuery ProgressBar ve Doğrulama ile Çoklu Dosya Yükleme (Kaynak kodunu indirmek için burayı tıklayın)

PHP'ye Nasıl Dosya Yüklenir ve MySql Veritabanında Nasıl Saklanır (Kaynak kodunu indirmek için buraya tıklayın)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.