저는 최근에 정적 컨텐츠 처리기 프로젝트에서 작업 해 왔으며,이 작업이 저에게 충격적이었습니다. 이전과 같은 방법으로 이미지를 브라우저에 표시 할 수 없습니다. 이미지가 정확하고 내 코드가 거의 동일하기 때문에 불가능합니다.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));
에서
... 전용 디스크에 이미지를 저장, 그냥 DB에 경로 이름을 유지하는 것이 더 쉽다. '우리가 쿼리를 실행할 수있는 날까지 "SELECT image from table WHERE image contains'red car '"... :) (꽤 가까운 곳). 실제 파일을 사용하십시오! * 내 2 € * – OcuS
이것은 여러 서버간에 공유 할 수있는 유일한 방법입니다. –
그래서 공유 파일 시스템 (NFS 또는 기타)을 사용하십시오. – OcuS