Affichage d'image d'une base postgres 9.1

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Affichage d'image d'une base postgres 9.1

Re: Affichage d'image d'une base postgres 9.1

par moogli » 25 nov. 2013, 13:55

as tu simplement afficher ce qu'il y avait dans $raw ?
ou mis dans un fichier voir si c'était une image correct ?
juste un file_put_contents('lefichier.jpg',$raw); suffit et tu regarde avec ton os ce fichier.

quand tu appel directement la chose dans l'url il te met quoi le navigateur ?
tu peux voir la trace réseau ?

il y a une erreur dans les logs php / apache ?

ensuite si tu récupère correctement le contenu du champ picture soit il y a un encodage ou équivalent des données avant insertion dans le champs bytea qui te manque (comme par exemple bin2hex de mes script) soit heu bien ça marche pas :)
est tu certain du type de fichier (c'est du jpeg ?).

@+

Re: Affichage d'image d'une base postgres 9.1

par jbvador64 » 24 nov. 2013, 21:09

Hello
je galère grave.!!!

voici ce que j'ai fait mais impossible d'affiché ces images..
<?

include ('/web/pg_connect.php');

$con = pg_pconnect("host=$server dbname=$database user=$user password=$pw");


// Récupération des données bytea
$res = pg_query('select picture from picture WHERE id ='8992' and type ='1');


pg_query($con, "SET bytea_output='escape'");
// Récupération des données bytea

/ Récupération des données bytea
$raw = pg_fetch_result($res,0, 'picture');

// Convertit en binaire et envoie au navigateur
header('Content-type: image/jpeg');
echo pack('H*', pg_unescape_bytea($raw));

?>

Le logiciel du produit est fait en java et insert et relis les image de la db sans problème..

le mien est en php !

Help.. ça me rend fous..

Salutations

Re: Affichage d'image d'une base postgres 9.1

par moogli » 21 nov. 2013, 01:41

salut,

après une tite recherche google : http://sickel.net/blogg/?p=1365

j'ai donc testé rapidement avec :
la table
CREATE TABLE tstblob
(
  titre text,
  testbytea bytea,
  id serial NOT NULL,
  type text,
  CONSTRAINT tstblob_pkey PRIMARY KEY (id)
)
on commence par l'affichage
<?php

if (!empty($_GET['fileid'])) {
    try {
        $pdo = new PDO("pgsql:dbname=test;host=localhost;port=5432", 'test', 'test');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        $sql = 'select testbytea, type from tstblob where id=' . $pdo->quote($_GET['fileid'], PDO::PARAM_INT);
        $res = $pdo->query($sql);
        if ($res !== false) {
            $data = $res->fetch(PDO::FETCH_ASSOC);
            if ($data['testbytea'] != null && is_resource($data['testbytea'])) {
                header('Content-Type: '.$data['type']);
                echo pack('H*',fgets($data['testbytea'])); // parce qu'enregistré en hexa
            }
        }
    } catch (PDOException $pdoe) {
        echo 'Error !<br />' . $pdoe->getMessage() . '<br />' . $pdoe->getTraceAsString();
    }
}
dans le cas d'un bytea pdo fournit une ressource, similaire à ce que tu aurais avec un fopen, du coup on utilise fgets.

le code d'insertion (un simple formulaire et une table qui liste la table te permet l'appel au script d'affichage
<!doctype html>
<html>
<head>
    <title>Test bytea pgsql</title>
    <style type="text/css">
        .center {
            text-align: center;
        }
    </style>
</head>
<body stye="padding:5px;">
<?php

if (extension_loaded('pdo_pgsql')) {
    echo 'extension pdo_pgsql chargée : <hr />';
}
try {
    $pdo = new PDO("pgsql:dbname=test;host=localhost;port=5432", 'test', 'test');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

// traitement du formulaire
    if (!empty($_POST['submit']) && !empty($_FILES['fichier']['tmp_name'])) {

        $sql = 'insert into tstblob (titre, testbytea, type) values(:titre,:fichier, :type)';
        $stmt = $pdo->prepare($sql);
        $fichier = bin2hex(file_get_contents($_FILES['fichier']['tmp_name'])); // passage du contenu en hexa
        $stmt->bindParam(':fichier', $fichier, PDO::PARAM_LOB);
        $stmt->bindValue(':titre', $_POST['titre']);
        echo '<br/>(type du fichier up ' . $_FILES['fichier']['type'] . ' )<br />';
        $stmt->bindValue(':type', $_FILES['fichier']['type']);
        $stmt->execute();
    }
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}
?>
<h2>ce qu'il y a dans la base</h2>
<table style="width:100%">
    <thead style="background-color: #dcdcdc">
    <tr>
        <th>id</th>
        <th>titre</th>
        <th>type</th>
        <th>dl</th>
    </tr>
    </thead>
    <tfoot>
    <tr>
        <td colspan="4" style="background-color: #ff4500"></td>
    </tr>
    </tfoot>
    <tbody>
    <?php
    try {
        $sql = 'select id, titre, type  from tstblob';
        $res = $pdo->query($sql);
        if ($res !== false) {
            $i = 0;
            $impaire = '#dcdcdc';
            while ($data = $res->fetch(PDO::FETCH_ASSOC)) {
                if ($i % 2 != 0) {
                    $style = 'style="background-color:#dcdcdc;"';
                } else {
                    $style = '';
                }

                echo '<tr ' . $style . '>
				<td class="center">' . $data['id'] . '</td>
				<td>' . $data['titre'] . '</td>
				<td>' . $data['type'] . '</td>
				<td><a href="getfile.php?fileid=' . $data['id'] . '">download</a></td></tr>';
            }
            $res->closeCursor();
        } else {
            echo 'Erreur SQL : ' . $pdo->errorInfo()[2];
        }
    } catch (Exception $e) {
        echo 'Erreur : ' . $e->getMessage() . '<br />';
        echo 'N° : ' . $e->getCode();
    }
    ?>
    </tbody>
</table>
<h2>En ajouter</h2>

<form method="post" action="" enctype="multipart/form-data">
    <label for="titre">Titre : </label><input type="text" name="titre"/><br/>
    <label for="file">File : </label><input type="file" name="fichier"/><br/>
    <input type="submit" value="add" name="submit" style="width:150px;"/>
</form>
</body>
</html>
pourquoi PDO ?
par habitude et parce que cela me permet de changer de sgbd assez facilement si je le souhaite ;)

j'ai suivis l'exemple sans aller plus loin, par manque de temps mais c'est fonctionnel.

pour revenir sur ton code j'ai testé a partir de l'exemple de la doc (dont provient ton code ?).
<?php

if (!empty($_GET['fileid'])) {
    $dbconn = pg_connect('dbname=test host=localhost port=5432 user=test password=test');
    pg_query($dbconn, "SET bytea_output='escape'");
    // Récupération des données bytea
    $res = pg_query('select testbytea, type from tstblob where id=' . $_GET['fileid']);
//    $raw = pg_fetch_result($res,0, 'testbytea');
    $data = pg_fetch_assoc($res);
    // Convertit en binaire et envoie au navigateur
    header('Content-type: ' . $data['type']);
    echo pack('H*', pg_unescape_bytea($data['testbytea']));    
}
j'ai utilisé pg_fetch_assoc parce que j'ai le type mime en base c'est plus simple, je trouve, que le fetch_result.
dans ton exemple à toi il te manque le N° de ligne (le zéro dans mon cas).

si en ajoutant le zéro tu n'arrive pas a résoudre le soucis, tu peux mettre dans un fichier ce que tu récupère (et le nommer avec une extension jpg) et voir si le fichier s'ouvre correctement.
si ce n'est pas le cas c'est que ce que tu reçois est corrompu.
Comment fait tu l'insertion des données en base ?
n'y as t'il pas un truc que tu fait à l'insertion et pas à la récupération (perso j'ai cherché 5 minutes pourquoi mon image ne s'affichée pas alors que j’avais oublié la fonction pack dans la reprise du code de la doc :mrgreen: ).

quand tu dit erreur à l'affichage c'est quoi l'erreur ?

@+

Re: Affichage d'image d'une base postgres 9.1

par jbvador64 » 20 nov. 2013, 23:16

Hello
Merci mais toujours rien..

voici mon code
<?
include ('/web/pg_connect.php');

$con = pg_connect("host=$server dbname=$database user=$user password=$pw");
pg_query($con, "SET bytea_output='escape'");
$res = pg_query("SELECT picture FROM picture WHERE id ='8992'");

// Récupération des données bytea
$raw = pg_fetch_result($res, 'picture');

// Convertit en binaire et envoie au navigateur
header('Content-type: image/jpeg');
echo pg_unescape_bytea($raw);

?>

erreur a l'affichage..

j'ai verifier les donnée dans la DB je récupère bien 23471 ou en escape \x3233343731

je deverai convertir en bin ?

j'ai pas eu de problème en MSSQL et en MYsql ç'est un peux case tête..

Merci de vos réponce..

JB

Re: Affichage d'image d'une base postgres 9.1

par moogli » 20 nov. 2013, 01:09

salut,

as tu regardé la doc de php à ce sujet ?
ou la doc de postgresql ? http://docs.postgresql.fr/9.3/datatype- ... nary-table et un exemple java

du coup je m'orienterais vers les fonctions comme pg_unescape_bytea
il y a même un exemple avec une image dans la doc :)


@+

Affichage d'image d'une base postgres 9.1

par jbvador64 » 19 nov. 2013, 22:12

Hello
J'ai dévelopé une webappli qui va ce connecté sur des base sql et mysql.
J'ai sans mal afficher les images issu de champs blob..

Je migre maintenant sur une base postgres 9.1 pour complèté ma gamme mais postgres ne dispose pas de champs blob.
i sagit de champ byterea un truc du genre je ne sait pas commant extraire les photo de mes personne depuis cette base..

Quelque un a déja fait ceci ??

A+

JB