загрузка нескольких файлов изображений в php mysql gallery

Я получил этот камбуз, работающий примерно на 65% от того, где я хочу. Мне было интересно, может ли кто-нибудь просмотреть следующий код и рассказать мне, как загружать несколько изображений в мою галерею.

Вот код.

Простой код формы администратора:

<form enctype="multipart/form-data" action="uploader.php" method="POST"> Category: <select class="text" name="dataType[]"> <option value="treeremoval" selected="selected">treeremoval</option> <option value="treetrimming" >treetrimming</option> <option value="treebracing" >treebracing</option> <option value="stumpgrinding" >stumpgrinding</option> <option value="firewood" >firewood</option> <option value="cleanup" >cleanup</option> </select> <br /><br /> Caption: <input type="text" name="title[]"> <br /><br /> Image to upload: <input type="file" name="image[]" /> <br /><br /> Category: <select class="text" name="dataType[]"> <option value="treeremoval" selected="selected">treeremoval</option> <option value="treetrimming" >treetrimming</option> <option value="treebracing" >treebracing</option> <option value="stumpgrinding" >stumpgrinding</option> <option value="firewood" >firewood</option> <option value="cleanup" >cleanup</option> </select> <br /><br /> Caption: <input type="text" name="title[]"> <br /><br /> Image to upload: <input type="file" name="image[]" /> <br /><br /> <input type="submit" value="Upload"> </form> 

Код uploader.php:


  <?php include($_SERVER['DOCUMENT_ROOT'] . "/connections/dbconnect.php"); $dataType = mysql_real_escape_string($_POST["dataType"][$i]); $title = mysql_real_escape_string($_POST["title"][$i]); $fileData = pathinfo(basename($_FILES["image"]["name"][$i])); $fileName = uniqid() . '.' . $fileData['extension'][$i]; $target_path = ($_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName); for($i=0;$i<count($_FILES["image"]["name"]);$i++){ $dataType = mysql_real_escape_string($_POST["dataType"][$i]); // get the dataType with the same key - $i $title = mysql_real_escape_string($_POST["title"][$i]); // get the title with the same key - $i $fileData = pathinfo(basename($_FILES["image"]["name"][$i])); while(file_exists($target_path)) { $fileName = uniqid() . '.' . $fileData['extension']; $target_path = ($_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName); } if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)) { // The file is in the images/gallery folder. Insert record into database by // executing the following query: $sql="INSERT INTO images (data_type, title, file_name)"."VALUES('$dataType','$title','$fileName')"; $retval = mysql_query($sql); echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br /> <a href='index.php'>Add another image</a><br />"; } else { echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />"; } } // close your foreach ?> в  <?php include($_SERVER['DOCUMENT_ROOT'] . "/connections/dbconnect.php"); $dataType = mysql_real_escape_string($_POST["dataType"][$i]); $title = mysql_real_escape_string($_POST["title"][$i]); $fileData = pathinfo(basename($_FILES["image"]["name"][$i])); $fileName = uniqid() . '.' . $fileData['extension'][$i]; $target_path = ($_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName); for($i=0;$i<count($_FILES["image"]["name"]);$i++){ $dataType = mysql_real_escape_string($_POST["dataType"][$i]); // get the dataType with the same key - $i $title = mysql_real_escape_string($_POST["title"][$i]); // get the title with the same key - $i $fileData = pathinfo(basename($_FILES["image"]["name"][$i])); while(file_exists($target_path)) { $fileName = uniqid() . '.' . $fileData['extension']; $target_path = ($_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName); } if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)) { // The file is in the images/gallery folder. Insert record into database by // executing the following query: $sql="INSERT INTO images (data_type, title, file_name)"."VALUES('$dataType','$title','$fileName')"; $retval = mysql_query($sql); echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br /> <a href='index.php'>Add another image</a><br />"; } else { echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />"; } } // close your foreach ?> 

Я пробовал дублировать код формы 4 раза, но он загрузил только 1 изображение в галерею.

Любая помощь будет принята с благодарностью.

Спасибо!

    В вашей форме добавьте несколько файлов. Один из способов – использовать имя массива – image[]

     Image to upload: <input type="file" name="image[]" /><br /> Image to upload: <input type="file" name="image[]" /><br /> Image to upload: <input type="file" name="image[]" /><br /> .... // as many as you want. Just be aware of upload_max_filesize, memory_limit, post_max_size etc. <br /> 

    Затем в файле uploader.php оберните код загрузки файла с помощью цикла for

     for($i=0;$i<count($_FILES["image"]["name"]);$i++){ $fileData = pathinfo(basename($_FILES["image"]["name"][$i])); ... if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)) { ... echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br />"; } else { echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />"; } } // close your foreach 

    в руководстве есть большой раздел о распространенных ошибках при загрузке файлов, особенно нескольких. http://www.php.net/manual/en/features.file-upload.common-pitfalls.php


    Если вы хотите сделать несколько других, это можно сделать так же (я сократил выбор для уменьшения копирования / вставки) –

     <form enctype="multipart/form-data" action="uploader.php" method="POST"> // 1st set Category: <select class="text" name="dataType[]" /> ... </select><br /> <br /> Caption: <input type="text" name="title[]" /><br /> <br /> Image to upload: <input type="file" name="image[]" /><br /> <br /> // 2nd set Category: <select class="text" name="dataType[]" /> ... </select><br /> <br /> Caption: <input type="text" name="title[]" /><br /> <br /> Image to upload: <input type="file" name="image[]" /><br /> <br /> // and so on, as many as you want ... <input type="submit" value="Upload"> </form> 

    и ваш php, установите цикл for вокруг всех элементов

     for($i=0;$i<count($_FILES["image"]["name"]);$i++){ $dataType = mysql_real_escape_string($_POST["dataType"][$i]); // get the dataType with the same key - $i $title = mysql_real_escape_string($_POST["title"][$i]); // get the title with the same key - $i $fileData = pathinfo(basename($_FILES["image"]["name"][$i])); ... if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)) { ... echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br />"; } else { echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />"; } } // close your foreach 

    редактировать
    Вы почти там. Удалите дублирующий код над циклом for. Удалите basename() , так как это приведет к сбою вашего extension , а pathinfo() вернет ['basename'] .

     <?php include($_SERVER['DOCUMENT_ROOT'] . "/connections/dbconnect.php"); for($i=0;$i<count($_FILES["image"]["name"]);$i++){ if($_FILES["image"]["name"][$i] != ''){ // don't insert if file name empty $dataType = mysql_real_escape_string($_POST["dataType"][$i]); $title = mysql_real_escape_string($_POST["title"][$i]); $fileData = pathinfo($_FILES["image"]["name"][$i]); $fileName = uniqid() . '.' . $fileData['extension']; $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName; while(file_exists($target_path)){ $fileName = uniqid() . '.' . $fileData['extension']; $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName; } if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)){ // The file is in the images/gallery folder. // Insert record into database by executing the following query: $sql="INSERT INTO images (data_type, title, file_name) "."VALUES('$dataType','$title','$fileName')"; $retval = mysql_query($sql); echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br /> <a href='index.php'>Add another image</a><br />"; } else { echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />"; } } } // close your foreach ?> в <?php include($_SERVER['DOCUMENT_ROOT'] . "/connections/dbconnect.php"); for($i=0;$i<count($_FILES["image"]["name"]);$i++){ if($_FILES["image"]["name"][$i] != ''){ // don't insert if file name empty $dataType = mysql_real_escape_string($_POST["dataType"][$i]); $title = mysql_real_escape_string($_POST["title"][$i]); $fileData = pathinfo($_FILES["image"]["name"][$i]); $fileName = uniqid() . '.' . $fileData['extension']; $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName; while(file_exists($target_path)){ $fileName = uniqid() . '.' . $fileData['extension']; $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName; } if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)){ // The file is in the images/gallery folder. // Insert record into database by executing the following query: $sql="INSERT INTO images (data_type, title, file_name) "."VALUES('$dataType','$title','$fileName')"; $retval = mysql_query($sql); echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br /> <a href='index.php'>Add another image</a><br />"; } else { echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />"; } } } // close your foreach ?> 

    По-видимому, функция HTML5, которая, к сожалению, не поддерживается в Internet Explorer до версии 10 (!), Позволяет вам сделать это:

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

    Это также справедливо:

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

    (Косая черта факультативна, но мне нравится самозакрывающиеся теги, чтобы иметь косую черту, поэтому я решил поместить косые черты).

    Однако есть инструменты JavaScript и т. Д., Которые, очевидно, расширяют совместимость. Подобно этой вещи JQuery. blueimp.github.io/jQuery-File-Upload

    (Источник: как выбрать несколько файлов с помощью <input type = "file">? )

    (Я был уверен, что существует более простой, совместимый с IE метод, но, возможно, я это себе представлял. В любом случае, я, по-видимому, оставил документацию по загрузке у своего учителя в школе, прежде чем отправиться на каникулы, поэтому я не могу точно знать.)

    Так что да. У вас есть этот multiple="multiple" вход, который выполняет задание. Но это определенно недостаточно подходит для ваших нужд. Потому что, вы знаете, не так много людей имеют IE 10, и есть предел для канав IE. Оттуда у вас есть несколько вариантов.

    1. Проверьте совместимость с входами с несколькими файлами с помощью такого инструмента, как Modernizr, и если браузер несовместим, вместо него вы увидите несколько входов с одним файлом. Или, может быть, только один, а затем вы добавите еще один Javascript, если используется предыдущий.

    2. Загляните в этот плагин jQuery или другие подобные инструменты, чтобы «заставить» браузеры быть совместимыми с вашим вводом нескольких файлов.

    Пример использования многофайлового ввода:

    HTML:

     <form method="post" action="upload.php" enctype="multipart/form-data"> <input name="uploads[]" type="file" multiple="multiple" /> <input type="submit" value="Send" /> </form> 

    Затем в PHP все ваши файлы будут храниться там, где обычно вы найдете свой единственный файл, за исключением того, что теперь он будет массивом, и вы получите доступ к нему, добавив дополнительный слой квадратных скобок. Например, $_FILES['uploads']['name'][0] – ваш первый файл.

    Следующий код позволит вам выполнять итерацию по каждому отдельному файлу. Конечно, этот код отображает только каждое имя файла, но вы можете изменить содержимое цикла.

     foreach ($_FILES['uploads']['name'] as $filename) { echo '<li>' . $filename . '</li>'; } 

    И внутри этого цикла вы будете загружать каждый файл, как обычно, для одного файла.

    (Источник: http://css-tricks.com/snippets/html/multiple-file-input/ )

    Самый простой способ – добавить несколько входных file (в одной форме) с тем же именем, добавив квадратные скобки:

     <input type="file" name="image[]"> 

    Затем вы можете получить доступ к файлам, добавив инкрементный номер:

     $_FILES["image"]["name"][0] 

    Таким образом, вы ставите весь процесс после загрузки в цикл, повторяющийся через файлы. Обратите внимание, что в случае, если вы не всегда отправляете изображение с каждым вводом файла, некоторые переменные (= входы) остаются пустыми, и вам необходимо изменить свою обработку ошибок, чтобы не показывать ошибку. Я бы сделал это так:

     if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)) { //processing... } else if (!empty($_FILES["image"]["name"][$i]) { //error } 

    Я не знаю, могу ли я отправлять ссылки, но я нашел, что ищет систему, загружающую многократные файлы, и хочу поделиться со всеми остальными, которые тоже ищут это.

    MySQL

     CREATE TABLE `upload_data` ( `ID` int(5) NOT NULL AUTO_INCREMENT, `USER_CODE` int(4) unsigned zerofill NOT NULL, `FILE_NAME` varchar(200) NOT NULL, `FILE_SIZE` varchar(200) NOT NULL, `FILE_TYPE` varchar(200) NOT NULL, PRIMARY KEY (`ID`) ) 

    PHP

     <?php if(isset($_FILES['files'])){ $errors= array(); foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){ $file_name = $key.$_FILES['files']['name'][$key]; $file_size =$_FILES['files']['size'][$key]; $file_tmp =$_FILES['files']['tmp_name'][$key]; $file_type=$_FILES['files']['type'][$key]; if($file_size > 2097152){ $errors[]='File size must be less than 2 MB'; } $query="INSERT into upload_data (`USER_ID`,`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`) VALUES('$user_id','$file_name','$file_size','$file_type'); "; $desired_dir="user_data"; if(empty($errors)==true){ if(is_dir($desired_dir)==false){ mkdir("$desired_dir", 0700); // Create directory if it does not exist } if(is_dir("$desired_dir/".$file_name)==false){ move_uploaded_file($file_tmp,"user_data/".$file_name); }else{ //rename the file if another one exist $new_dir="user_data/".$file_name.time(); rename($file_tmp,$new_dir) ; } mysql_query($query); }else{ print_r($errors); } } if(empty($error)){ echo "Success"; } } ?> <form action="" method="POST" enctype="multipart/form-data"> <input type="file" name="files[]" multiple/> <input type="submit"/> </form> 

    Это оно! Надежда помочь кому-то ^^ Полные объяснения и все кредиты: http://techstream.org/Web-Development/PHP/Multiple-File-Upload-with-PHP-and-MySQL