Я получил этот камбуз, работающий примерно на 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. Оттуда у вас есть несколько вариантов.
Проверьте совместимость с входами с несколькими файлами с помощью такого инструмента, как Modernizr, и если браузер несовместим, вместо него вы увидите несколько входов с одним файлом. Или, может быть, только один, а затем вы добавите еще один Javascript, если используется предыдущий.
Загляните в этот плагин 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 }
Я не знаю, могу ли я отправлять ссылки, но я нашел, что ищет систему, загружающую многократные файлы, и хочу поделиться со всеми остальными, которые тоже ищут это.
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 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