Bagaimana saya bisa memilih dan mengunggah banyak file dengan HTML dan PHP, menggunakan HTTP POST?

155

Saya memiliki pengalaman melakukan ini dengan menggunakan satu file unggahan <input type="file">. Namun, saya mengalami masalah dalam mengunggah lebih dari satu.

Misalnya, saya ingin dapat memilih serangkaian gambar, lalu mengunggahnya ke server, sekaligus.

Akan lebih baik menggunakan kontrol input file tunggal, jika memungkinkan.

Adakah yang tahu bagaimana mencapainya? Terima kasih!

stalepretzel
sumber
2
Apakah maksud Anda memilih lebih dari satu file dalam dialog pemilih file atau menggunakan beberapa input file?
MitMaro
Hai, Anda dapat mengunggah file arsip (zip, rar, tar, ...)?
sourcerebels

Jawaban:

196

Ini dimungkinkan dalam HTML5 . Contoh (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>

Begini tampilannya di Chrome setelah memilih 2 item dalam dialog file:

pilih beberapa file chrome

Dan inilah tampilannya setelah mengklik tombol "Unggah".

mengirimkan beberapa file ke PHP

Ini hanya sketsa jawaban yang berfungsi penuh. Lihat Manual PHP: Menangani unggahan file untuk informasi lebih lanjut tentang penanganan unggahan file yang benar dan aman dalam PHP.

Mark E. Haase
sumber
8
apakah itu lulus validasi w3c, atau haruskah itu terjadi multiple="multiple"?
vol7ron
10
Saya percaya ini valid: thoughtresults.com/html5-boolean-attributes . Itu melewati validator w3c jika Anda menambahkan <! Doctype html>.
Mark E. Haase
2
ya, mungkin memvalidasi HTML, tetapi gagal XHTML. Meskipun saya masih suka menggunakan XHTML, saya pikir orang menyarankan untuk menjauh dari itu hari ini.
vol7ron
11
Itu tidak berfungsi tanpa menambahkan nama properti (mis name="file[]".). Saya mencoba mengedit jawabannya , tetapi ditolak.
Michel Ayres
1
Terima kasih @MichelAyres, saya telah memperbarui jawaban saya. Ketika saya awalnya menulis ini, saya hanya membahas bagian HTML dari masalah b / c ada jawaban lain yang menjelaskan bagian PHP. Seiring waktu, ini menjadi jawaban yang populer, jadi saya sekarang diperluas untuk mencakup HTML dan PHP.
Mark E. Haase
94

Ada beberapa hal yang perlu Anda lakukan untuk membuat beberapa file unggahan, sebenarnya cukup mendasar. Anda tidak perlu menggunakan Java, Ajax, Flash. Cukup buat formulir unggah file normal yang dimulai dengan:

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

Kemudian kunci kesuksesan;

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

JANGAN lupakan tanda kurung itu! Di post_upload.php coba yang berikut ini:

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

Perhatikan bahwa Anda mendapatkan array dengan data tmp_name, yang berarti Anda dapat mengakses setiap file dengan kurung ketiga dengan contoh 'number' file:

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

Anda dapat menggunakan jumlah php () untuk menghitung jumlah file yang dipilih. Goodluck widdit!

Epoxys
sumber
5
Terima kasih atas tipnya! itu sangat menghemat waktu saya +1
BPm
Ini berfungsi dengan sangat baik ... tapi saya mengalami masalah mengunggah dengan cara ini di Internet Explorer (v8). Saya pikir IE tidak mendukung mengunggah dengan cara ini.
Tariq M Nasim
4
Atau Anda dapat mengulang-ulang file dengan foreachpernyataan, tanpa harus tahu jumlah file yang diunggah ...
ygesher
Catatan, jika Anda menggunakan kunci dalam nama Anda di html Anda, misalnya name = "file [3]", maka Anda perlu mengakses nilai melalui $ _FILES ['file'] ['tmp_name'] [3], dalam kasus itu tidak jelas.
MyStream
8

Solusi lengkap di Firefox 5:

<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>
Terima kasih
sumber
Kode terpotong. Inilah yang datang tepat di atasnya: <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>
Thap
3
Itu tidak bekerja di IE8, tetapi kemudian hanya menggunakan browser nyata.
Thap
5

Jika Anda ingin memilih beberapa file dari dialog pemilih file yang ditampilkan ketika Anda memilih browse maka Anda sebagian besar kurang beruntung. Anda harus menggunakan applet Java atau yang serupa (saya pikir ada yang menggunakan file flash kecil, saya akan memperbarui jika saya menemukannya). Saat ini input file tunggal hanya memungkinkan pemilihan satu file.

Jika Anda berbicara tentang menggunakan beberapa input file maka seharusnya tidak ada banyak perbedaan dari menggunakannya. Kirimkan beberapa kode dan saya akan mencoba membantu lebih lanjut.


Pembaruan: Ada satu metode untuk menggunakan tombol 'browse' tunggal yang menggunakan flash. Saya tidak pernah secara pribadi menggunakan ini tetapi saya telah membaca cukup banyak tentang hal itu. Saya pikir ini tembakan terbaik Anda.

http://swfupload.org/

MitMaro
sumber
1
Saya menambahkan tautan ke beberapa pengunggah berbasis flash.
MitMaro
Saya telah menggunakan swfupload fwiw - kadang-kadang sedikit menyakitkan tetapi tidak terlalu sulit untuk bekerja.
Meep3D
@Arsoom benar. Banyak hal menjadi lebih baik pada beberapa unggahan file dalam beberapa tahun terakhir. : D
MitMaro
4

di pertama Anda harus membuat bentuk seperti ini:

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

itu benar . sekarang tambahkan kode ini di bawah kode formulir Anda atau di halaman mana pun yang Anda suka

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

mudah ... selesai

pooya laryan
sumber
1

Jika Anda menggunakan beberapa bidang input, Anda dapat mengatur name = "file []" (atau nama lainnya). Itu akan menempatkan mereka dalam sebuah array ketika Anda mengunggahnya ( $_FILES['file'] = array ({file_array},{file_array]..))

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

Menggunakan FOR Loop

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

    }               
  }    
?>

Menggunakan FOREACH Loop

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

    }               
  }
?>
antelove
sumber
0

saya telah membuat fungsi php yang digunakan untuk mengunggah beberapa gambar, fungsi ini dapat mengunggah banyak gambar dalam folder tertentu juga dapat menyimpan catatan ke dalam database dalam kode berikut $ arrayimage adalah array gambar yang dikirim melalui form note bahwa itu tidak akan memungkinkan unggahan untuk menggunakan banyak tetapi Anda harus membuat bidang masukan berbeda dengan nama yang sama seperti Anda dapat mengatur bidang tambah dinamis unput file pada klik tombol.

$ dir adalah direktori di mana Anda ingin menyimpan gambar $ fields adalah nama bidang yang ingin Anda simpan dalam database

bidang database harus dalam contoh format array jika Anda memiliki database imagestore dan nama bidang seperti id, nama, alamat maka Anda perlu memposting data seperti

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

dan kemudian meneruskan bidang itu ke bidang fungsi $

$ table adalah nama tabel tempat Anda ingin menyimpan data ..

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
}

// kelas imageFunctions berakhir di sini

Anda dapat mencoba kode ini untuk menyisipkan beberapa gambar dengan ekstensinya. Fungsi ini dibuat untuk memeriksa file gambar. Anda dapat mengganti daftar ekstensi untuk file yang terkait dalam kode

Prateik Darji
sumber
Hai semua, saya menggunakan input file untuk melampirkan dokumen ke email autogenerated. Saya dapat melampirkan banyak dokumen saat bepergian, namun, saya ingin melampirkan banyak dokumen dari direktori yang berbeda. Saat ini jika saya melakukan ini, dokumen yang saya pilih saat ini diganti oleh dokumen baru yang saya pilih. Tolong, bagaimana saya melakukannya? Terima kasih
Kunbi
-1

sebagian jawaban: pir HTTP_UPLOAD dapat bermanfaat http://pear.php.net/manual/en/package.http.http-upload.examples.php

ada contoh lengkap untuk banyak file

damko
sumber
1
Anda dapat menggunakan paket PEAR tetapi tugas ini cukup sepele dan kecuali Anda memerlukan fitur tambahan yang disediakan paket (pesan kesalahan yang diinternasionalkan, validasi, dll ...) Saya akan merekomendasikan menggunakan fungsi PHP asli. Tapi ini hanya pendapat saya saja. :)
MitMaro
Saya setuju dengan Anda, itu sebabnya saya menulis "jawaban parsial". Tapi saya juga melakukan yang terbaik untuk kembali menggunakan kode dan saya sering bekerja sebagai sebanyak yang saya bisa dengan pir (coders pir jauh lebih baik dari saya: -D)
damko