I have the following code which works and uploads but it will not cycle through the array to upload every file, just the first file.
it's easy to upload multiple files, follow these steps.
<input type="file" id="indtbl_logo[]" name="indtbl_logo[]" multiple />
foreach ($_FILES['indtbl_logo']['tmp_name'] as $key => $tmp_name) {
$file_name = $key . $_FILES['indtbl_logo']['name'][$key];
$file_size = $_FILES['indtbl_logo']['size'][$key];
$file_tmp = $_FILES['indtbl_logo']['tmp_name'][$key];
$file_type = $_FILES['indtbl_logo']['type'][$key];
echo $file_name;
echo "<br>";
}
File upload using multiple input fields.
HTML
<form action="" method="post" enctype="multipart/form-data">
<p><input type="file" name="file_array[]"></p>
<p><input type="file" name="file_array[]"></p>
<p><input type="file" name="file_array[]"></p>
<input type="submit" value="Upload all files">
</form>
PHP
<?php
if(isset($_FILES['file_array'])){
$name_array = $_FILES['file_array']['name'];
$tmp_name_array = $_FILES['file_array']['tmp_name'];
$type_array = $_FILES['file_array']['type'];
$size_array = $_FILES['file_array']['size'];
$error_array = $_FILES['file_array']['error'];
for($i = 0; $i < count($tmp_name_array); $i++){
if(move_uploaded_file($tmp_name_array[$i], "test_uploads/".$name_array[$i])){
echo $name_array[$i]." upload is complete<br>";
} else {
echo "move_uploaded_file function failed for ".$name_array[$i]."<br>";
}
}
}
?>
you can use my updated code and as per my demo it is working perfect for multiple file upload
<?php
if(isset($_FILES['documents'])){
foreach($_FILES['documents']['tmp_name'] as $key => $tmp_name)
{
$file_name = $key.$_FILES['documents']['name'][$key];
$file_size =$_FILES['documents']['size'][$key];
$file_tmp =$_FILES['documents']['tmp_name'][$key];
$file_type=$_FILES['documents']['type'][$key];
move_uploaded_file($file_tmp,"galleries/".time().$file_name);
}
}else{
echo "<form enctype='multipart/form-data' action='test1.php' method='POST'>";
echo "File:<input name='documents[]' multiple='multiple' type='file'/><input type='submit' value='Upload'/>";
echo "</form>";
}
?>
Try with this code for multifile upload
<form method="post" action="upload-page.php" enctype="multipart/form-data">
<input name="filesToUpload[]" id="filesToUpload" type="file" multiple="" />
</form>
In PHP
if(count($_FILES['uploads']['filesToUpload'])) {
foreach ($_FILES['uploads']['filesToUpload'] as $file) {
//do your upload stuff here
echo $file;
}
}
To show the file name using javascript
//get the input and UL list
var input = document.getElementById('filesToUpload');
var list = document.getElementById('fileList');
//empty list for now...
while (list.hasChildNodes()) {
list.removeChild(ul.firstChild);
}
//for every file...
for (var x = 0; x < input.files.length; x++) {
//add to list
var li = document.createElement('li');
li.innerHTML = 'File ' + (x + 1) + ': ' + input.files[x].name;
list.append(li);
}
For anyone trying to do it with a single file php function (i`m using classes, but you can change to a function):
html:
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
php:
if (isset($_FILES['foto'])) {
$arquivo = array();
foreach ($_FILES['foto']["name"] as $file=>$key) {
// the empty input files create an array index too, so we need to
// check if the name exits. It means the file exists.
if (!empty($_FILES['foto']["name"][$file])) {
$arquivo ["name"] = $_FILES['foto']["name"][$file];
$arquivo ["type"] = $_FILES['foto']["type"][$file];
$arquivo ["tmp_name"] = $_FILES['foto']["tmp_name"][$file];
$arquivo ["error"] = $_FILES['foto']["error"][$file];
$arquivo ["size"] = $_FILES['foto']["size"][$file];
$foto = new foto(); // create an obj foto
// $arquivo means file, it`s our file format as a single $_file['file']
if ($foto -> upload($arquivo)) { // if its uploaded than save
$foto -> save();
}
}
}
}
on my foto class:
public function upload($foto) {
$upload_dir = "D:/xampp/htdocs/prova/fotos/";
$file_dir = $upload_dir . $foto["name"];
$move = move_uploaded_file($foto["tmp_name"], $file_dir);
$this -> arquivo = $foto["name"]; // use this to save to db later
// this serves to return true if the file is uploaded
$retorno = ($move) ? 1 : 0;
return $retorno;
}
Try this way of loop your documents array()
<?php
foreach($_FILES['documents']['tmp_name'] as $key => $tmpName) {
$file_name = $_FILES['documents']['name'][$key];
$file_type = $_FILES['documents']['type'][$key];
$file_size = $_FILES['documents']['size'][$key];
$file_tmp = $_FILES['documents']['tmp_name'][$key];
move_uploaded_file($file_tmp,"files/".time().$file_name);
}
?>