2010-01-22 6 views
0

저는 최근에 정적 컨텐츠 처리기 프로젝트에서 작업 해 왔으며,이 작업이 저에게 충격적이었습니다. 이전과 같은 방법으로 이미지를 브라우저에 표시 할 수 없습니다. 이미지가 정확하고 내 코드가 거의 동일하기 때문에 불가능합니다.SQL 데이터베이스에서 이미지 표시

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] 

데이터 열을 사용하는 다음

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

테이블 Static_Image하지만, 이것은 복수의 서버로 확장하기위한 방법으로 최근까지 사용되지 않은 것이다.

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

에서

+0

... 전용 디스크에 이미지를 저장, 그냥 DB에 경로 이름을 유지하는 것이 더 쉽다. '우리가 쿼리를 실행할 수있는 날까지 "SELECT image from table WHERE image contains'red car '"... :) (꽤 가까운 곳). 실제 파일을 사용하십시오! * 내 2 € * – OcuS

+0

이것은 여러 서버간에 공유 할 수있는 유일한 방법입니다. –

+0

그래서 공유 파일 시스템 (NFS 또는 기타)을 사용하십시오. – OcuS

답변

0

는 그 $b->convert($data[0])해야 하는가?

노트, 그것은 데이터베이스에 이미지를 저장하는 것은 실제로 더-좋은 솔루션입니다

+0

명확히하려면 : 내 문제는 이미지 자체를 표시하고 있습니다. 헤더를 올바르게 설정하고 파일이 존재하는지 여부를 확인한 후에도 fpassthru와 함께 표시되지 않습니다. –

관련 문제