Показать изображение, сохраненное в mysql в PHP с понятными URL-адресами и OOP - PullRequest
0 голосов
/ 13 июля 2020

Я не могу показать изображение, которое находится на сервере mysql, в поле blob. Сохранение изображений в mysql работает, я могу извлекать данные, но когда я хочу их отобразить, я не могу. Попробуйте реализовать пример, приведенный на этом веб-сайте: [baulphp] 1

В основном он вызывает файл PHP, который извлекает изображение и возвращает его, переписывая заголовок с функция заголовка, а затем эхо содержимого. Но проблема в том, что я пробую это в проекте MVC и POO, и URL-адрес дружественный, а URL-адреса переписываются через .htaccess. Итак, я не могу напрямую вызвать файл PHP, как пример из той сети ...

Я попытался сделать это из примера в действии контроллера и вызвать его внутри тега IMG, но это не так. тоже не работает.

это мой код, это форма представления:

<form method="POST" action="<?= BASE_URL ?>productos/<?= $metodo ?>" enctype="multipart/form-data">
    <h2><?= $texbut ?> Producto</h2>
    <p><label for="p_nombre">Nombre del Producto:<span class="asterisco">&nbsp;*</span></label></p>
    <p><input type="text" name="p_nombre" <?= $_SESSION['abm_prod'] == 3 ? 'disabled="disabled"' : '' ?> 
              value="<?= $_SESSION['abm_prod'] > 1 ? $prod2edit->p_nombre : ''; ?>" id="p_nombre" maxlength="100" 
              required="required" autofocus="autofocus" placeholder="Ingrese nombre del producto..."> </p>
    
    <p><label for="p_descrip">Descripcion del Producto:</label></p>
    <p><textarea name="p_descrip" <?= $_SESSION['abm_prod'] == 3 ? 'disabled="disabled"' : '' ?> 
              id="p_descripcion" autofocus="autofocus" 
              placeholder="Ingrese descripción del producto..."><?= $_SESSION['abm_prod'] > 1 ? $prod2edit->p_descripcion : ''; ?></textarea></p>
    
    <p><label for="p_red">Nombre reducido:</label></p>
    <p><input type="text" name="p_red" <?= $_SESSION['abm_prod'] == 3 ? 'disabled="disabled"' : '' ?> 
              value="<?= $_SESSION['abm_prod'] > 1 ? $prod2edit->p_red : ''; ?>"
              id="p_red" maxlength="20" autofocus="autofocus" placeholder="Ingrese nombre reducido/corto..."> </p>
    
    <p><label for="p_imagen">Cargar foto del producto</label></p>
    <div class="abmformcontent2 clearfix">
        <div class="abmformleft">
            <input class="botonfoto" type="file" name="p_imagen" />
            <?php if(isset($_SESSION['errorimg'])): ?>
                    <p class="errores"><?= $_SESSION['errorimg'] ?></p>
            <?php endif; ?>

            <p><label for="p_precio">Precio:<span class="asterisco">&nbsp;*</span></label></p>
            <p><input class="inputval" type="text" name="p_precio" <?= $_SESSION['abm_prod'] == 3 ? 'disabled="disabled"' : '' ?> 
                      value="<?= $_SESSION['abm_prod'] > 1 ? $prod2edit->p_precio : ''; ?>"
                      id="p_precio" required="required" autofocus="autofocus" placeholder="Ingrese precio del producto ..."> </p>

            <p><label for="p_stock">Stock:</label></p>
            <p><input class="inputval" type="number" name="p_stock" <?= $_SESSION['abm_prod'] == 3 ? 'disabled="disabled"' : '' ?> 
                      value="<?= $_SESSION['abm_prod'] > 1 ? $prod2edit->p_stock : ''; ?>"
                      id="p_stock" autofocus="autofocus" placeholder="Stock actual..."> </p>

            <?php $categorias = Utilidades::Cat_for_menu(); ?>
            <p><label for="p_catid">Seleccione Categoría:</label></p>
            <select class="selectorcat" name="p_catid" <?= $_SESSION['abm_prod'] == 3 ? 'disabled="disabled"' : '' ?>>
                <?php while ($cat = $categorias->fetch_object()): ?>
                <option value="<?= $cat->c_id ?>" <?= $_SESSION['abm_prod'] > 1 && $cat->c_id==$prod2edit->p_categoria_id ? 'selected' : ''; ?> >
                    <?= $cat->c_nombre ?>
                </option>
                <?php endwhile; ?>
            </select>
        </div>
        <div class="abmformright">
            <img src='<?= BASE_URL ?>productos/viewimg&p_id=<?= $prod2edit->p_id ?>' alt='Imagen producto'   />
        </div>
    </div>

    <p><input type="number" hidden="hidden" name="p_id" value="<?= isset($prod2edit->p_id) ? $prod2edit->p_id : ''; ?>" ></p>
    
    <div class="boton3">
        <input type="submit" class="boton" value="Confirmar">
        <a href="<?=BASE_URL?>productos/gestion"><input type="button" class="boton" value="Cancelar"></a>
    </div>
</form>

А вот часть контроллера и действие:

require_once 'models/mproductos.php';
require_once 'models/mimages.php';

Class ProductosController{
    
    public function viewimg() {
        
        $id = filter_input(INPUT_GET, 'p_id', FILTER_SANITIZE_NUMBER_INT);

        if($id>0){
            //Credenciales de conexion
            $Host = 'localhost';
            $Username = 'prueba';
            $Password = '123456';
            $dbName = 'macrotienda';

            //Crear conexion mysql
            $db = new mysqli($Host, $Username, $Password, $dbName);

            //revisar conexion
            if($db->connect_error){
               die("Connection failed: " . $db->connect_error);
            }

            //Extraer imagen de la BD mediante GET
            $result = $db->query("SELECT * FROM images WHERE i_producto = $id");

            if($result->num_rows > 0){
                $imgDatos = $result->fetch_assoc();
                
                //Mostrar Imagen
                header("Content-type: ".$imgDatos['i_mimetype']); 
                echo $imgDatos['i_content']; 
            }else{
                echo 'Imagen no existe...';
            }
        }
        
    }
    
    // *************************************************************************
    
    public function gestion() {

        $productos = new mProductos();
        $allproductos = $productos->Traer_Todos();
        require_once 'views/products/gestion.php';
        
    }

Уточнение: Как видно в действии "viewimg", это все соединение, то есть только в тестовом режиме, потому что на самом деле этот класс наследует параметры соединения, тестирует оба способа и оба получают объект базы данных ...

Вот это когда вы записываете изображение:

public function create() {
    $insert = "insert into macrotienda.images values(null,".
              " '$this->filename', ".
              " '$this->mimetype', ".
              "  $this->height,    ".
              "  $this->width,     ".
              " '$this->hwtext',   ".
              "  $this->size,      ".
              " '$this->content',  ".
              "  now(),            ".
              "  $this->producto_id ) ";

    $result = $this->conn->query($insert);
    return $result;

здесь, когда вы назначаете эти данные:

$imagen  = $_FILES['p_imagen'];

$ftype = $imagen['type'];
$fsize = $imagen['size'];

$ftmp   = $imagen['tmp_name'];

$ftamaño = getimagesize($ftmp);

$image = new mimages();
$image->setFilename($imagen['name']);
$image->setHeight($ftamaño[0]);
$image->setWidth($ftamaño[1]);
$image->setHwtext($ftamaño[3]);
$image->setMimetype($ftype);
$image->setSize($fsize);
$image->setContent(addslashes(file_get_contents($ftmp)));

Я все еще новичок в PHP программировании ... как мне показать изображение?

СПАСИБО

1 Ответ

0 голосов
/ 14 июля 2020

Вот решение:

В форме просмотра это должно быть go вот так:

 <div class="abmformright">
     <?php if(isset($_SESSION['img_prod'])): ?>
          <?php echo '<img src="data:image/jpeg;base64,'.base64_encode($_SESSION['img_prod']->i_content ).'"  />'; ?>
     <?php endif; ?>
</div>

Спасибо !!!

...