HTTP POST'u kullanarak HTML ve PHP ile birden fazla dosyayı nasıl seçebilir ve yükleyebilirim?


155

Bunu kullanarak tek dosya yüklemeleri ile deneyimim var <input type="file">. Ancak, bir kerede birden fazla yükleme yaparken sorun yaşıyorum.

Örneğin, bir dizi resim seçip ardından hepsini bir kerede sunucuya yüklemek istiyorum.

Mümkünse tek bir dosya giriş kontrolü kullanmak harika olurdu.

Bunu nasıl başaracağını bilen var mı? Teşekkürler!


2
Dosya seçici iletişim kutusunda veya birden çok dosya girişi kullanarak birden fazla dosya mı seçmek istediniz?
MitMaro

Merhaba, Bir arşiv dosyası (zip, rar, tar, ...) yüklemeniz mümkün mü?
sourcerebels

Yanıtlar:


196

Bu HTML5'te mümkündür . Örnek (PHP 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>

Dosya iletişim kutusunda 2 öğe seçtikten sonra Chrome'da şöyle görünür:

chrome çoklu dosya seçimi

"Yükle" düğmesini tıkladıktan sonra şöyle görünür.

PHP'ye birden fazla dosya gönderme

Bu sadece tamamen çalışan bir cevap taslağıdır. PHP'de dosya yüklemelerinin düzgün ve güvenli bir şekilde işlenmesi hakkında daha fazla bilgi için bkz. PHP Kılavuzu: Dosya yüklemelerini işleme.


8
w3c doğrulamasını geçiyor multiple="multiple"mu yoksa olmalı mı?
vol7ron

10
Geçerli olduğuna inanıyorum: thoughtresults.com/html5-boolean-attributes . <! Doctype html> eklerseniz w3c doğrulayıcısını geçer.
Mark E. Haase

2
evet, muhtemelen HTML'yi doğrular, ancak XHTML'de başarısız olur. Hala XHTML kullanmaktan hoşlanmama rağmen, insanlar bugünlerde ondan uzak durmayı tavsiye ediyorlar.
vol7ron

11
Mülk adını eklemeden çalışmadı (örn. name="file[]"). Cevabı düzenlemeye çalıştım , ama reddedildi.
Michel Ayres

1
Teşekkürler @MichelAyres, cevabımı güncelledim. Ben orjinal olarak bu yazdı, ben sadece b / c sorunun HTML kısmını ele PHP kısmı açıklayan başka cevaplar vardı. Zamanla, bu popüler bir cevap oldu, bu yüzden şimdi hem HTML hem de PHP'yi kapsayacak şekilde genişledim.
Mark E. Haase

94

Birden çok dosya yüklemesi oluşturmak için yapmanız gereken birkaç şey var, aslında oldukça basit. Java, Ajax, Flash kullanmanıza gerek yoktur. Sadece aşağıdakilerden başlayarak normal bir dosya yükleme formu oluşturun:

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

Sonra başarının anahtarı;

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

bu parantezleri UNUTMAYIN! Post_upload.php dosyasında şunları deneyin:

<?php print_r($_FILES['file']['tmp_name']); ?>

Tmp_name verisine sahip bir dizi aldığınıza dikkat edin, bu da her dosyaya 'number' örneği ile üçüncü bir parantez çifti ile erişebileceğiniz anlamına gelir:

$_FILES['file']['tmp_name'][0]

Seçilen dosya sayısını saymak için php count () kullanabilirsiniz. Goodluck widdit!


5
Bahşiş için teşekkürler! beni çok zamandan kurtardı +1
BPm

Çok iyi çalışıyor ... ama Internet Explorer'da (v8) bu şekilde yükleme konusunda sorun yaşıyorum. Bence IE bu şekilde yüklemeyi desteklemiyor.
Tarık M Nasim

4
Veya foreachyüklenen dosya sayısını bilmek zorunda kalmadan bir ifade ile dosyalar arasında döngü yapabilirsiniz ...
ygesher

HTML'nizde adınızda bir anahtar kullanırsanız, örneğin name = "file [3]" ise, değere $ _FILES ['file'] ['tmp_name'] [3] aracılığıyla erişmeniz gerekir. bu belli değil.
MyStream

8

Firefox 5'te tam çözüm:

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

Kod kesildi. İşte, tam üzerinden verilmektedir: <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>
Thaps

3
IE8'de işe yaramadı, ancak daha sonra gerçek bir tarayıcı kullanın.
12'de

5

Göz atmayı seçtiğinizde görüntülenen dosya seçici iletişim kutusundan birden fazla dosya seçmek isterseniz, çoğunlukla şansınız kalmaz. Bir Java uygulaması veya benzeri bir şey kullanmanız gerekecek (küçük bir flash dosyası kullanan bir tane olduğunu düşünüyorum, bulursam güncelleyeceğim). Şu anda tek bir dosya girişi yalnızca tek bir dosya seçimine izin vermektedir.

Birden fazla dosya girişi kullanmaktan bahsediyorsanız, bir tane kullanmaktan çok fazla fark olmamalıdır. Bazı kod göndermek ve ben daha fazla yardım etmeye çalışacağız.


Güncelleme: Flash kullanan tek bir 'göz at' düğmesini kullanmanın bir yöntemi vardır. Bunu hiç kişisel olarak kullanmadım ama bu konuda adil bir miktar okudum. Bence bu senin en iyi vuruşun.

http://swfupload.org/


1
Bağlantıyı flash tabanlı çoklu yükleyiciye ekledim.
MitMaro

Swfupload fwiw kullandım - bazen biraz acı çekiyor ama çalışmak gerçekten zor değil.
Meep3D

@Barsoom doğrudur. Son birkaç yılda çoklu dosya yüklemelerinde işler çok daha iyi oldu. : D
MitMaro

4

ilk önce böyle bir form yapmalısınız:

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 

bu doğru . şimdi bu kodu form kodunuzun altına veya istediğiniz herhangi bir sayfaya ekleyin

<?php
if(isset($_POST['ok']))
   foreach ($_FILES['file']['name'] as $filename) {
    echo $filename.'<br/>';
}
?>

bu kolay ... bitir


1

Birden fazla giriş alanı kullanıyorsanız name = "file []" (veya başka bir ad) ayarlayabilirsiniz. Bu, onları yüklediğinizde bir diziye koyar ( $_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>

FOR Loop kullanma

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

    }               
  }    
?>

FOREACH Döngüsünü Kullanma

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

birden fazla görüntü yüklemek için kullanılan bir php fonksiyonu oluşturduk, bu fonksiyon belirli bir klasöre birden fazla görüntü yükleyebilirsiniz yanı sıra aşağıdaki kodda veritabanına kayıtları kaydedebilirsiniz $ arrayimage form notu ile gönderilen görüntü dizisidir yüklemenin birden fazla kullanmasına izin vermeyeceğini, ancak düğme tıklamasında dosya tanıtıcısının dinamik ekleme alanını ayarlayabileceğiniz gibi aynı adla farklı giriş alanı oluşturmanız gerekir.

$ dir, görüntüyü kaydetmek istediğiniz dizindir $ fields, veritabanında depolamak istediğiniz alanın adıdır

veritabanı görüntü dizisi ve id, ad, adres gibi alan adınız varsa veritabanı alanı dizi format örneğinde olmalıdır.

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']);

ve sonra bu alanı $ field fonksiyonuna iletin

$ table, verileri depolamak istediğiniz tablonun adıdır.

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
}

// imageFunctions sınıfı burada bitiyor

uzantısı ile birden fazla görüntü eklemek için bu kodu deneyebilirsiniz bu işlev görüntü dosyalarını kontrol etmek için oluşturulan koddaki pertiküler dosyalar için uzantı listesini değiştirebilirsiniz


Merhabalar, otomatik olarak oluşturulan bir e-postaya belge eklemek için dosya girişini kullanıyorum. Bir seferde birden fazla belge ekleyebiliyorum, ancak farklı dizinden birden çok belge eklemek istiyorum. Halihazırda bunu yaparsam, seçili olan dokümanın yerini seçtiğim yeni doküman alır. Lütfen bunu nasıl yapacağım. Teşekkürler
Kunbi

-1

kısmi cevap: armut HTTP_UPLOAD faydalı olabilir http://pear.php.net/manual/en/package.http.http-upload.examples.php

birden fazla dosya için tam bir örnek var


1
PEAR paketini kullanabilirsiniz, ancak bu görev oldukça önemsizdir ve paketin sağladığı ekstra özelliklere ihtiyacınız yoksa (uluslararası hata mesajları, doğrulama vb.) Yerel PHP işlevlerini kullanmanızı tavsiye ederim. Ama bu sadece benim düşüncem. :)
MitMaro

Sana katılıyorum, bu yüzden "kısmi cevap" yazdım. Ama aynı zamanda kodu tekrar kullanmak için elimden geleni yapıyorum ve sıklıkla
armutla yapabildiğim
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.