2013-07-11 2 views
3

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

Вот код.

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

<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 
?> 

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

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

Спасибо!

+0

добавить несколько '<входной тип =«Файл»>' каждый с уникальным именем –

+0

Вы можете установить это в относительно простой способ ... Я думаю, он находится на типе ввода = «файл», где вы помещаете тип данных ... или что-то еще? Тогда ваш $ _FILES будет массивом из нескольких файлов. Мы сделали это в школе, один вход для нескольких файлов, но мы использовали шаблон учителя, поэтому я забыл. Если вы не можете найти уведомление, и я буду искать в своих файлах. – Ariane

+0

@ Dagon вы могли бы объяснить немного подробнее. Извините, что я новичок в этом типе кодирования. – cwd

ответ

5

В вашей форме добавьте несколько входных файлов. Один из способов заключаются в использовании имени массива - 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($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> 

и РНР, положить для контура вокруг всех элементов

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 
?> 
+0

Прошу прощения за то, что я был необразован этим, я понимаю, что ответ прямо передо мной, но когда я попробовал его с помощью множества ошибок. Не могли бы вы использовать предоставленный мной код и изменить его для меня. Просто не знаете, с чего начать скрипт foreach ...? – cwd

+0

Я использовал ваш код. Я не хотел копировать/вставлять все это, поэтому я использую аббревиатуру '...', чтобы показать, что вам не нужно менять. Сохраните код, но просто добавьте/отредактируйте строки, которые я показал. – Sean

+0

в порядке Я попробую еще раз. Спасибо. – cwd

1

Самый простой способ добавить несколько 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 
} 
2

По-видимому, особенность 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

(Источник: How to select multiple files with <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/)

+0

все в порядке? –

+0

Не уверен, что вы можете написать «true» как значение для атрибута «multiple». Просто '' работает. Кроме того, убедитесь, что ваша форма имеет 'enctype =" multipart/form-data "'. – Ariane

0

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

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