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

).
quand tu dit erreur à l'affichage c'est quoi l'erreur ?
@+