J'ai récemment travaillé sur un projet de gestionnaire de contenu statique, ce qui me frappe beaucoup. Je n'arrive pas à faire apparaître les images dans le navigateur de la même manière que je le pouvais auparavant. L'image est correcte, et c'est impossible parce que mon code reste à peu près le même.Affichage d'images à partir de la base de données SQL
ob_start();
function ImageExistsSql($img)
{
$rows = mssql_num_rows(mssql_query("SELECT id FROM Static_Image WHERE name = N'{$img}'"));
if($rows > 0)
{
return true;
}
else
{
return false;
}
}
function ImageExistsFile($img)
{
if(!file_exists("images/".$img))
{
return false;
}
else
{
return true;
}
}
function CreateImageFile($img)
{
if(!ImageExistsFile($img))
{
$b =& new hex2bin;
$data = mssql_fetch_row(mssql_query("SELECT data FROM Static_Image WHERE name = N'{$img}'"));
$file = fopen("images/".$img, 'a+');
fwrite($file, $b->convert($data));
fclose($file);
}
}
function GetExtension($img)
{
return mssql_fetch_row(mssql_query("SELECT extension FROM Static_Image WHERE name = N'{$img}'"));
}
function WriteImageDataToScreen($img)
{
$r = mssql_fetch_row(mssql_query("SELECT data FROM Static_Image WHERE name = N'{$img}'"));
$d = str_split($r);
for($i = 0; $i < strlen($r); $i++)
{
echo($d[$i]);
}
}
function ContentHeader($img)
{
$ext = GetExtension($img);
switch($ext[0])
{
case "png":
case ".png":
header("Content-type: image/png");
break;
case "gif":
case ".gif":
header("Content-type: image/gif");
break;
case "jpg":
case "jpeg":
case ".jpg":
case ".jpeg":
header("Content-type: image/jpeg");
break;
default:
die("[STATIC HANDLER] Extension: {$ext} not found");
break;
}
}
if(isset($_GET['i']))
{
$imgf = $_GET['i'];
$ext = GetExtension($imgf);
if(ImageExistsSql($imgf))
{
if(ImageExistsFile($imgf))
{
ContentHeader($imgf);
//$fn = fopen("images/".$imgf, 'rb');
//fpassthru($fn);
// fpassthru isn't working anymore, used to work.
WriteImageDataToScreen($imgf);
}
else
{
CreateImageFile($imgf);
header("Location: {$_SERVER['REQUEST_URI']}");
}
}
else
{
die("[STATIC HANDLER] IMAGE NON EXISTANT");
}
}
else
{
die("[STATIC HANDLER] FAILED TO PROCESS FILE");
}
ob_end_flush();
Le tableau Static_Image se présente comme suit
CREATE TABLE [dbo].[Static_Image](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[extension] [varchar](6) NULL,
[dateadded] [date] NULL,
[data] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
la colonne de données est utilisée, cependant, n'a pas été utilisé jusqu'à récemment comme un moyen d'étendre ce sur plusieurs serveurs.
Enregistrement d'images dans la base de données est en fait un non-bonne solution. 'jusqu'au jour où nous pourrions exécuter des requêtes comme "SELECT image FROM table où l'image CONTIENT' voiture rouge '" ... :) (assez proche de JAMAIS). Utilisez de vrais fichiers! * mon 2 € * – OcuS
Ceci est seulement pour que je puisse partager entre plusieurs serveurs. –
Donc, utilisez des systèmes de fichiers partagés (NFS ou autre). – OcuS