Bene, l'argomento è stra ritrito, oramai direi pure omogeneizzato, però certe cose rimangono in mente ed è sempre più difficile correggersi.
Il problema più grosso, al solito, è riconoscere l'errore la dove non sembrano essercene.
Fatta questa doverosa premessa vengo al dunque: dovendo rifare un sito, il quale tra l'altro presenta un migliaglio circa di immagini raccolte in una cartella del filesystem, tutte JPG tra l'altro; ho avuta la bella pensata di metterle tutte in un record.
Così, preso il record corrente, con tutte le belle didascalie, titoli e riferimenti alle immagini presenti nel filesystem, ci ho inserito un bel campo chiamato foto come MEDIUMBLOB ( le immagini solo dell'ordine dei 50Kb max. ) ed ho creata una routine che le carica dentro ogni record del database. Bene!
Poi mi creo il classico failetto che dato un certo ID carica l'immagine corrispondente... e no, manco pe gnente!
Che come si vede, porta i segni delle mie prove ( poche ) ma che non danno gli esiti sperati.
Allora mi viene il dubbio di aver sbagliato a caricare le immagini nel database!
Solo che non so come e dove, dato che nel database le immagini ci sono, ne ho pure scaricata una ( da phpMyAdmin ), una di quelle che mi davano errore, e l'ho visualizzata correttamente nella cartella di destinazione!
Comunque il semplice programma di caricamento è questo:
Forse ho commesso l'errore di non codificare le immagini prima di caricarle nel database? E se sì come?
base64 o cosa? e perché?
Il problema più grosso, al solito, è riconoscere l'errore la dove non sembrano essercene.
Fatta questa doverosa premessa vengo al dunque: dovendo rifare un sito, il quale tra l'altro presenta un migliaglio circa di immagini raccolte in una cartella del filesystem, tutte JPG tra l'altro; ho avuta la bella pensata di metterle tutte in un record.
Così, preso il record corrente, con tutte le belle didascalie, titoli e riferimenti alle immagini presenti nel filesystem, ci ho inserito un bel campo chiamato foto come MEDIUMBLOB ( le immagini solo dell'ordine dei 50Kb max. ) ed ho creata una routine che le carica dentro ogni record del database. Bene!
Poi mi creo il classico failetto che dato un certo ID carica l'immagine corrispondente... e no, manco pe gnente!
Allora controllo e modifico il programma di visualizzazione:The image cannot displayed because it contains errors!
PHP:
ob_start();
session_start();
session_regenerate_id();
try
{
function giveAPicture($id)
{
try
{
$conn = PDOConnetti();
$handle = $conn->prepare('SELECT foto, attivo FROM immagini WHERE id=:id LIMIT 1;');
$handle->bindValue(':id', (int)$id, PDO::PARAM_INT);
$handle->execute();
$giochi = $handle->fetch();
unset( $conn, $handle );
}
catch (PDOException $e)
{
echo $e->getTraceAsString() . '<br><br>';
echo $e->getCode() . '<br>' .
$e->getFile() . '<br>' .
$e->getLine() . '<br><br>' .
$e->getMessage();
}
return $giochi;
}
if (filter_has_var(INPUT_POST, 'id') && filter_has_var(INPUT_GET, 'id') > 0 )
{
$file = giveAPicture(filter_var($_GET['id'], FILTER_VALIDATE_INT));
if ($file['attivo'] == 1)
{
if ($file['foto'] != null)
{
header('Content-Type: image/jpeg');
// echo $file['foto'];
// echo 'data:image/jpeg;base64,' . base64_decode($file['foto']);
echo 'data:image/jpeg;base64,' . base64_encode($file['foto']);
}
}
}
else
{
}
}
catch (Exception $ex) {
echo 'ERRORE GENERICO<br><br>';
echo $ex->getTraceAsString() . '<br><br>' .
$ex->getCode() . '<br>' .
$ex->getFile() . '<br>' .
$ex->getLine() . '<br>' .
$ex->getMessage();
}
Allora mi viene il dubbio di aver sbagliato a caricare le immagini nel database!
Solo che non so come e dove, dato che nel database le immagini ci sono, ne ho pure scaricata una ( da phpMyAdmin ), una di quelle che mi davano errore, e l'ho visualizzata correttamente nella cartella di destinazione!
Comunque il semplice programma di caricamento è questo:
PHP:
try
{
include_once __DIR__ . '/bin/genericFunction.inc.php';
$conn = PDOConnetti();
$sql = 'UPDATE immagini SET foto = :foto WHERE url_immagine = :url;';
$handle = $conn->prepare($sql);
echo '<h1>Immagini</h1><h2>Salvataggio foto nel DB</h2><hr>';
foreach(glob('foto/*.jpg') as $name)
{
if (!is_dir($name))
{
if (is_readable($name))
{
$fp = fopen($name, 'rb');
$content = fread( $fp, filesize($name));
fclose($fp);
if ( strlen($content) > 0 )
{
$url = basename($name);
echo '<p>Sto salvando: <strong>' . $url . '</strong></p>';
$handle->bindValue( ':foto', $content, PDO::PARAM_LOB );
$handle->bindValue( ':url', $url, PDO::PARAM_STR );
$handle->execute();
}
}
}
}
unset($conn, $handle );
}
catch (PDOException $e)
{
echo 'ERRORE DATABASE:<br><br>';
echo $e->getTraceAsString() . '<br><br>';
echo $e->getCode() . '<br>' .
$e->getFile() . '<br>' .
$e->getLine() . '<br><br>' .
$e->getMessage();
}
catch (Exception $e)
{
echo 'ERRORE CODICE:<br><br>';
echo $e->getTraceAsString() . '<br><br>';
echo $e->getCode() . '<br>' .
$e->getFile() . '<br>' .
$e->getLine() . '<br><br>' .
$e->getMessage();
}
base64 o cosa? e perché?