TBlobfield - wczytanie nietypowy problem

0

Witam!

Mam problem z odczytaniem pliku z bazy SQL - pole blob. Mianowicie w polu jest przechowywana grafika, zapisuje ją na na dysku jako np 'plik.jpg' po czym muszę tą grafikę przekształcić - jednak nie zawsze tam jest plik jpg - może być png, gif etc. Czy istnieje jakaś możliwość by sprawdzić jakie rozszerzenie posiada plik zapisany do pola blob?

Pozdrawiam

0

generalnie nie - musisz sobie gdzieś obok zapisywać jeszcze co to za plik. W blobie masz tylko i wyłącznie 'środek' pliku. W szczególnych przypadkach można próbować po nagłówku pliku. Np.

1

właśnie w bazie nie miałem możliwości dodania bo program ma za zadanie odczytać z bazy innego programu.
znalazłem funkcję do sprawdzania nagłówków plików i działa idealnie.
załączam kod, może komuś się przyda:

var
Form1: TForm1;

JPG_HEADER: array[0..2] of byte = ($FF, $D8, $FF);
GIF_HEADER: array[0..2] of byte = ($47, $49, $46);
BMP_HEADER: array[0..1] of byte = ($42, $4D);
PNG_HEADER: array[0..3] of byte = ($89, $50, $4E, $47);
TIF_HEADER: array[0..2] of byte = ($49, $49, $2A);

type
TImageType = (ifUnknown, ifJPG, ifGIF, ifBMP, ifPNG, ifTIF);

implementation

{$R *.dfm}

function TypeToStr(ImageType: TImageType): String;
begin
case ImageType of
ifJPG: Result := 'Image/JPEG';
ifGIF: Result := 'Image/GIF';
ifPNG: Result := 'Image/PNG';
ifBMP: Result := 'Image/BMP';
ifTIF: Result := 'Image/TIFF';
else
Result := 'Unknown Type';
end;
end;

function GetImageType(FileName: String): TImageType;
var
Stream: TFileStream;
MemStr: TMemoryStream;
begin
Result := ifUnknown;
Stream := TFileStream.Create(FileName, fmOpenRead);
MemStr := TMemoryStream.Create;
try
MemStr.CopyFrom(Stream, 5);
if MemStr.Size > 4 then
begin
if CompareMem(MemStr.Memory, @JPG_HEADER, SizeOf(JPG_HEADER)) then
Result := ifJPG
else if CompareMem(MemStr.Memory, @GIF_HEADER, SizeOf(GIF_HEADER)) then
Result := ifGIF
else if CompareMem(MemStr.Memory, @PNG_HEADER, SizeOf(PNG_HEADER)) then
Result := ifPNG
else if CompareMem(MemStr.Memory, @BMP_HEADER, SizeOf(BMP_HEADER)) then
Result := ifBMP
else if CompareMem(MemStr.Memory, @TIF_HEADER, SizeOf(TIF_HEADER)) then
Result := ifTIF;
end;
finally
Stream.Free;
MemStr.Free;
end;
end;


//odczytanie
rozszerzenie := TypeToStr(GetImageType(nazwapliku));

1 użytkowników online, w tym zalogowanych: 0, gości: 1