I have a php form with unknown number of rows where user can upload files. For this purpose I use two dimensional array.
There were some changes to be made, in addition to the ones in the comments. Major issues are:
$_POST
and $_FILES
are, in PHP nature, totally separated entities. So you're ending up trying to access a single array row
when there is actually two row
arrays inside both these superglobals.$target_file
was never declared, and your $target_dir
has too many slashes.$val
the wrong way.These are the final corrections I came up with, keeping the logic for your own environment. The explanation to each part is commented inside the code.
HTML form
<!DOCTYPE html>
<html>
<head></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<table>
<?php $counter = 2; // number of fields you want to be printed
for($i = 0; $i < $counter; $i++): // do proper counting ?>
<tr>
<td>
<input type="hidden" name="row[]" value="<?php echo $i; ?>"/> File:
</td>
<td>
<input type="file" name="row[]" >
</td>
</tr>
<?php endfor; ?>
</table>
<input type="submit" value="Upload" name="submit">
</form>
</body>
</html>
PHP Post Script
<?php
$unique_id = "upload"; // just changed to reproduce
$unique_id = $unique_id . '/';
foreach ($_POST['row'] as $val) {
$target_dir = $unique_id;
$target_file = $_FILES['row']['name'][$val]; //actually defining this var
$target_dir = $target_dir . $val. "/"; // no need to index assoc nor '/'
if (!file_exists($target_dir)) {
mkdir($target_dir, 0777, true);
}
$imageFileType = pathinfo($target_dir,PATHINFO_EXTENSION);
// Check if image file is a actual image or fake image
// Check if file already exists
if (file_exists($target_file)) {
die("Sorry, file already exists."); // die if error
}
// Check file size
if ($_FILES['row']['size'][$val] > 900000000) { // using the proper index reference for file
die("Sorry, your file is too large."); //die if error
}
// Check if there are error msg in $_FILES
if ($_FILES['row']['error'][$val] != 0) {
die("Sorry, your file was not uploaded."); // die if error
// if everything is ok, try to upload file
} else {
// point your move_files with the final name of the actual file to be moved
if (move_uploaded_file($_FILES['row']['tmp_name'][$val], $target_dir.'/'.$_FILES['row']['name'][$val])) {
echo "The file ". basename($_FILES['row']['name'][$val]). " has been uploaded.<br>";
} else {
die("Sorry, there was an error uploading your file.");
}
}
}
Final Output (after uploading two dummy files)
Array
(
[row] => Array
(
[0] => 0
[1] => 1
)
[submit] => Upload
)
Array
(
[row] => Array
(
[name] => Array
(
[0] => dummyfile1.docx
[1] => dummyfile2.mpp
)
[type] => Array
(
[0] => application/vnd.openxmlformats-officedocument.wordprocessingml.document
[1] => application/vnd.ms-project
)
[tmp_name] => Array
(
[0] => C:\Windows\Temp\php73DA.tmp
[1] => C:\Windows\Temp\php73DB.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 0
[1] => 180224
)
)
)
The file dummyfile1.docx has been uploaded.
The file dummyfile2.mpp has been uploaded.