У меня есть php-форма с неизвестным количеством строк, где пользователь может загружать файлы. Для этой цели я использую двухмерный массив.
<form action="upload_file_module.php" method="post" enctype="multipart/form-data"> <? $i = 0; ?> <table> <tr> <td> <input type="hidden" name="row[<? echo $i; ?>][row_name]" value = "one"/> One </td> <td> <input type="file" name="row[<? echo $i; ?>][fileToUpload]" > </td> <? $i++; ?> </tr> <tr> <td> <input type="hidden" name="row[<? echo $i; ?>][row_name]" value = "two"/> Two </td> <td> <input type="file" name="row[<? echo $i; ?>][fileToUpload]" > </td> <? $i++; ?> </tr> </table> <input type="submit" value="Upload" name="submit">
Все файлы должны быть сохранены в разных папках.
<?php $unique_id = "folder"; $unique_id = $unique_id . '/'; foreach ( $_POST['row'] as $val ) { $target_dir = $unique_id; $target_dir = $target_dir . "/" . $val. "/"; if (!file_exists($target_dir)) { mkdir($target_dir, 0777, true); } echo '<table>'; echo '<tr>'; echo '<td>', $val['row_name'], '</td>'; echo '<td>', $val['fileToUpload'], '</td>'; echo '</tr>'; echo '</table>'; $target_file = $target_dir . basename($_FILES[$val['fileToUpload']]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image // Check if file already exists if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["fileToUpload"]["size"] > 900000000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.<br>"; } else { echo "Sorry, there was an error uploading your file.<br>"; } } }
Но на самом деле он не видит никаких файлов, а вывод выглядит так:
один
К сожалению, файл уже существует. Извините, ваш файл не был загружен.
два
К сожалению, файл уже существует. Извините, ваш файл не был загружен.
Были внесены некоторые изменения в дополнение к комментариям. Основные проблемы:
$_POST
и $_FILES
в природе PHP полностью разделены. Таким образом, вы пытаетесь получить доступ к одной row
массива, когда в обоих суперглобалах есть две массивы row
. $target_file
никогда не был объявлен, и ваш $target_dir
имеет слишком много $target_dir
. $val
неправильным образом. Это окончательные исправления, которые я придумал, сохраняя логику для вашей собственной среды. Объяснение каждой части комментируется внутри кода.
Форма HTML
<!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>