CodeIgniter - Загрузить файл с помощью формы - PullRequest
0 голосов
/ 28 мая 2020

Я уже немного в отчаянии, потому что я программирую проект в CodeIgniter, который является интернет-магазином продуктов питания. Проблема в том, что когда мне нужно создать продукт, у меня есть форма, в которой администратора просят ввести название, бренд, описание, цену, НДС, категорию и т. Д. c. продукта, а между ними есть еще одно поле, которое является изображением продукта . Что ж, когда я заполняю эту форму и отправляю ее, продукт добавляется в базу данных, и все работает отлично, за исключением того, что изображение продукта не копируется с моего жесткого диска в папку сервера.

Я использую: PHP 7.3.9 MySQL 5.7.26 CodeIgniter 3.1.8

Ставлю код этой формы (представления), который я уже столько раз менял , что ошибок должно быть слишком много:

<div class="container">
<?php if (isset($error)) {?>
    <div class="alert alert-danger">
        <?php echo validation_errors('<div class="container"><b><ul><li>','</li></ul></b></div>') ?>
    </div>
<?php }?>       
<div class="panel panel-default">

    <div class="panel-body">
        <h3 style='margin-left: 4em'>Crear Producto</h3>
        <h6 style='margin-left: 8em'>Rellena los siguientes campos con los datos del producto y una vez termines pulsa el botón.</h6>
        <hr>
        <?php echo form_open_multipart('Inicio/verificarProducto'); ?>
        <div class="row">

            <div style='margin-left: 6em' class="container">
                <div class="col-xs-3">
                    <div class="form-group">
                        <label for="user">Nombre *</label>
                        <input type="text" name="nombre" value="<?=set_value('nombre')?>" class="form-control" id="nombre" placeholder="Nombre del Producto" >
                    </div>
                </div>
                <div class="col-xs-3">
                    <div class="form-group">
                        <label for="pass">Descripción *</label>
                        <input type="text" name="descripcion" value="<?=set_value('descripcion')?>" class="form-control" id="descripcion" placeholder="Descripción del Producto" >
                    </div>
                </div>
            </div></div><hr>

            <div style='margin-left: 6em' class="container">

                <div class="row">
                 <div class="col-xs-4">
                    <div class="form-group">
                            <label for="image">Imagen *</label>

                            <!--El name del campo tiene que ser si o si "userfile"-->
                            <input type="file" name="imagen" value="<?=set_value('imagen')?>" />



                        </div>
                    </div>
                </div>

                <div class="row">
                    <div class="col-xs-4">
                        <div class="form-group">
                            <label for="marca">Marca *</label>
                            <input type="text" name="marca" value="<?=set_value('marca')?>" class="form-control" id="marca" placeholder="Marca del Producto" >
                        </div>
                    </div>
                    <div class="col-xs-2">
                        <div class="form-group">
                            <label for="pvp">PVP *</label>
                            <input type="numeric" name="pvp" value="<?=set_value('pvp')?>" class="form-control" id="pvp" placeholder="0" >
                        </div>
                    </div>
                    <div class="col-xs-2">
                        <div class="form-group">
                            <label for="iva">IVA *</label>
                            <input type="number" step=".01" name="iva" value="<?=set_value('iva')?>" class="form-control" id="iva" placeholder="0" >
                        </div>
                    </div>
                </div><h6 style='color: #2874A6;'>*El IVA no puede ser negativo.</h6>

                <div class="row">
                    <div class="col-xs-2"><hr>
                        <div class="form-group">
                            <label for="stock">Stock *</label>
                            <input type="number" name="stock" value="<?=set_value('stock')?>" class="form-control" id="stock" placeholder="0" >
                        </div>
                    </div>
                </div>

                <div class="row">
                    <div class="col-xs-4">
                        <div class="form-group">
                            <label for="categoria">Categoria *</label>
                            <input type="text" name="categoria" value="<?=set_value('categoria')?>" class="form-control" id="categoria" placeholder="Categoria del Producto" >
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-xs-2">
                        <div class="form-group">
                            <label for="finicio_dest">Fecha inicio de destacado (opcional)</label>
                            <input type="date" name="finicio_dest" value="<?=set_value('finicio_dest')?>" class="form-control" id="finicio_dest">
                        </div>
                    </div>
                    <div class="col-xs-2">
                        <div class="form-group">
                            <label for="ffin_dest">Fecha final de destacado (opcional)</label>
                            <input type="date" name="ffin_dest" value="<?=set_value('ffin_dest')?>" class="form-control" id="ffin_dest">
                        </div>
                    </div>
                </div>
            </div>  

            <hr>
            <a class="btn btn btn-default" style="margin-left: 50px;" href="<?=site_url().'/Inicio/cargarVista/panel_usuario_admin'?>"><b><span class="glyphicon glyphicon-chevron-left"></span>&nbsp;&nbsp;&nbsp;Volver atrás</b></a></center><button style='margin-left: 7em' type="submit" name="bcontinuar" class="btn btn-success"><B>Finalizar</B>&nbsp;&nbsp;<span class="glyphicon glyphicon-chevron-right"></span></button><br>
        </div>
    <?php echo form_close() ?>
</div>

Вот фрагмент контроллера, отвечающего за форму:

public function verificarProducto()
{
  $prueba = $this->mproducto->verCategoriasEx($this->input->post('category'));

  if($this->mproducto->verCategoriasEx($this->input->post('category')) >= 0){
    $a = intval($this->mproducto->verCategoriasEx($this->input->post('category')));
  }else{
    $datos_cat = array(
      'name' => $this->input->post('category'),
      'description' => "",
      'announce' => 0,
      'show' => 1
    );

    $a = $this->mproducto->insertaCategoria($datos_cat);
  }


  $datos = array(
    'category_id' => $a ,
    'name' => $this->input->post('nombre'),
    'brand' => $this->input->post('marca'),
    'description' => $this->input->post('descripcion'),
    'discount' => 0,
    'announce' => 0,
    'image' => $this->input->post('image'),
    'pvp' => $this->input->post('pvp'),
    'iva' => $this->input->post('iva'),
    'stock' => $this->input->post('stock'),
    'show' => 1,
    'finicio_dest' => $this->input->post('finicio_dest'),
    'ffin_dest' => $this->input->post('ffin_dest'),
    'destacado' => 1
  );
  $this->mproducto->insertaProducto($datos);
  $cuerpo = $this->load->view("producto_creado", "", TRUE);
  $this->cargaPlantilla($cuerpo, "");
}

Вот фрагмент контроллера, который загружает изображение :

<?php
if(!defined('BASEPATH'))
  exit('No direct script access allowed');

class subir_controller extends CI_Controller {

 public function __construct(){
  parent::__construct();
}

public function index(){ 
  $this->load->view('nuevoProducto', array('error' => ' ' ));
}

public function subir(){
  $dato = $this->input->post("txt_dato");
  $image_name = $_FILES['archivoImagen']['name'];
  $data = array("dato" => $dato, "image" => $image_name);
  $guardar = $this->msubir->guardar($data);
  $this->subirImagen();
}   

public function subirImagen(){
  $nombreCompleto = $_FILES['archivoImagen']['name'];
  $config['upload_path'] = './assets/img/productos/';
  $config['allowed_types'] = 'jpg|jpeg|png';
  $config['file_name'] = $nombreCompleto;
  $this->load->library('upload', $config);

  if(!$this->upload->do_upload('archivoImagen')) {
    $data['error'] = array('error' => $this->upload->display_errors());
  } else {
    $data['infoImagen'] = $this->upload->data();
  }
}
}
?>

И напоследок вот модель:

<?php
class Subir_model extends CI_Model
{
    function guardar($data)
    {
        $this->db->insert("subir", $data);
        if ($this->db->affected_rows() > 0) {
            return true;
        } else {
            return false;
        }
    }
}

Пробую уже давно и наверняка из смеси решений, которые пробовал, что-то есть о коде, который не имеет особого смысла, но сейчас он работает, как я сказал вам в начале вопроса. Сохраняйте все данные, включая имя изображения, в базу данных, но не копируйте изображение в папку сервера.

Если вы чего-то не понимаете, пожалуйста, дайте мне знать, и я постараюсь ответить вам как можно скорее.

Заранее благодарен за вашу помощь.

var_dump ($ _ POST) выводит:

array(10) { ["nombre"]=> string(4) "test" ["descripcion"]=> string(4) "test" ["marca"]=> string(4) "test" ["pvp"]=> string(2) "10" ["iva"]=> string(2) "10" ["stock"]=> string(3) "100" ["categoria"]=> string(4) "Test" ["finicio_dest"]=> string(0) "" ["ffin_dest"]=> string(0) "" ["bcontinuar"]=> string(0) "" }

1 Ответ

0 голосов
/ 28 мая 2020

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

Эта функция идентична form_open () выше, за исключением того, что она добавляет атрибут multipart, который необходим, если вы хотите использовать форму для загрузки файлов.

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

Также рекомендуется включить XSS FILTER для защиты данных, вводимых через форму, с помощью тега TRUE в функции input-> post вот так:

$this->input->post('some_data', TRUE);

Это позволит избежать строки и предотвратить атаки xss.

...