2010-01-22 3 views
0

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.

+0

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

+0

Ceci est seulement pour que je puisse partager entre plusieurs serveurs. –

+0

Donc, utilisez des systèmes de fichiers partagés (NFS ou autre). – OcuS

Répondre

0

dans

$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)); 

devrait-il être $b->convert($data[0])?

note, il est souvent plus facile de stocker l'image sur le disque exclusivement, et juste garder le chemin dans la db ...

+0

Pour clarifier: mon problème est l'affichage de l'image elle-même. Il ne s'affiche pas avec fpassthru même après avoir correctement défini l'en-tête et vérifié si le fichier existe ou non. –

Questions connexes