Как реализовать загрузку фото на сервер

Тема в разделе "PHP", создана пользователем AlexSpider, 24 май 2020.

  1. AlexSpider

    AlexSpider

    Регистрация:
    24 май 2020
    Сообщения:
    0
    Симпатии:
    0
    Всем привет!
    Вопрос довольно избитый, но все же, нужно реализовать загрузку фото в каталог на сервере с записью названия в БД.
    Оговорюсь сразу,в PHP не силён, так что сильно не ругайте.
    Есть модель (models/item.php) в которую изначально вставил код для сохранения фото

    PHP:
    protected function prepareTable($table){
            if (isset(
    $table->images) && is_array($table->images)){
                
    $registry = new Registry;
                
    $registry->loadArray($table->images);
                
    $table->images = (string)$registry;
            }
        }
    Так как код взял с админки, где для загрузки использовался type="media", поменял на type="file" и подправил филд в форме .xml

    PHP:
    <fields name="images">
                <
    field name="file"
                    
    type="file"
                    
    label="COM_ZAKUPKA_ITEM_IMG"
                    
    description=""
                    
    accept="image/jpeg,image/png,image/gif"
                
    />
        </
    fields>
    Добавил в форму где выводятся все филдсеты enctype="multipart/form-data"

    PHP:
    <form action="index.php?option=com_zakupka&layout=edit&id=<?php echo $this->item->id?>" method="POST" enctype="multipart/form-data" id="adminForm" name="adminForm" class="form-validate">
        <input type="hidden" name="task" value="">
        <div class="form-horizontal">
            <?php foreach($this->form->getFieldsets() as $name => $fieldset) :/?>
                <fieldset class="adminForm">
                    <legend><?php echo JText::_($fieldset->label);?></legend>
                        <div class="row-fluid">
                            <div class="span6">
                                <?php foreach($this->form->getFieldset($name) as $field) :?>
                                    <div class="control-group">
                                        <div class="control-label"><?php echo $field->label;?></div>
                                        <div class="controls"><?php echo $field->input;?></div>
                                    </div>
                                <?php endforeach;?>
                            </div>
                        </div>
                </fieldset>
            <?php endforeach;?>
        </div>

        <?php echo JHtml::_('form.token');
        
    ?>
    </form>
    Нашел код который проверил в index.php, как в песочнице, на работоспособность.

    PHP:
    <form method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" name="upload" value="Загрузить" />
    </form>



    <?php

    if(isset($_POST['upload'])) {
    if(empty(
    $_FILES['file']['size']))  die('Вы не выбрали файл');
    if(
    $_FILES['file']['size'] > (1024 1024)) die('Размер файла не должен превышать 5Мб');
    $imageinfo getimagesize($_FILES['file']['tmp_name']);

    $upload_dir 'uploads/'//имя папки с картинками
    $name $upload_dir.date('YmdHis').basename($_FILES['file']['name']);
    $mov move_uploaded_file($_FILES['file']['tmp_name'],$name);
      if(
    $mov) {
    //здесь коннект к БД
    $name htmlentities(stripslashes(strip_tags(trim($name))),ENT_QUOTES,'UTF-8');
    //если mysql - здесь еще mysql_real_escape_string обработай, mysqli - mysqli_real_escape_string,PDO - quote
    $query "INSERT INTO `shop_zakupka`(`images`) VALUES('$name')";
    //выполняешь запрос, если все ок - то выводишь "поздравления" если все плохо - выводишь ошибку
    //здесь запрос
      
    }
      else echo 
    'Произошла ошибка при загрузке фотографии. Пожалуйста, попробуйте снова';

    }
    ?>
    Сохранение фото идёт, но в БД не записывает, немного покопавшись понял, что для записи в базу мало обращения только к одному столбцу в таблице, пытался прикрутить его к модели на место старого но не могу найти какую функцию необходимо использовать.

    Да, название БД - `shop_zakupka`, столбец - `images`

    И ещё вопрос, будет ли идти сохранение через кнопки из общего представления view.html.php

    PHP:
    <div class="formelm-buttons">
            <button type="button" onclick="Joomla.submitbutton('item.save')">
                <?php echo JText::_('JSAVE'?>
            </button>
            <button type="button" onclick="Joomla.submitbutton('item.cancel')">
                <?php echo JText::_('JCANCEL'?>
            </button>
     </div>
    так как <input type="submit" name="upload" value="Загрузить" /> из формы выше конечно прийдется убрать.

    За ранее спасибо всем кто откликнется, уже несколько дней не могу решить эту головоломку.
     
    Последнее редактирование: 24 май 2020
  2. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    вы пытаетесь скрестить ужа с ежом? потому что в начале у вас код от какого-то движка, а потом самописный кусок. Так вы определитесь :Smile:
    если это джумла, то зачем вообще что-то писать новое? Для джумлы хватает плагинов.
     
  3. AlexSpider

    AlexSpider

    Регистрация:
    24 май 2020
    Сообщения:
    0
    Симпатии:
    0
    Вся проблема в том что я пытаюсь написать компонент под свои нужды (как бы несуразно это не звучало с моими то знаниями PHP), функционал у него минимальный, сохранение данных от пользователя и вывод этих данных в админке, а "код от какого-то движка" это из такого же файла, только из админки models/item.php где формируется страница с помощью родительского контроллера JModelAdmin (подсмотрел создание компонента у одного автора), что характерно, код реально работает, но лишь записывает имя фото в указанную БД и при выводе на странице ссылается на корневой каталог.
    --- Добавлено, 24 май 2020 ---
    Также не совсем понимаю как встроить сторонний плагин в связку загрузки фото в каталог а названия в БД
    --- Добавлено, 24 май 2020 ---
    Готов заплатить за решение данного функционала