Chce obrazek jpg zapisać do bazy MySQL za pomocą dbExpress i potem go odczytać.
Obrazek w bazie chce zapisać jako LONGBLOB.
I robię coś takiego:
var
buffer: array[0..1000000] of char;
buf: string;
i: integer;
stream: TMemoryStream;
jpg: TJPEGImage;
begin
[...]
stream := TMemoryStream.Create;
jpg.SaveToStream(stream);
stream.Read(buffer, stream.Size);
for i:=0 to stream.Size-1 do buf := buf+buffer[i];
with Baza do
begin
[...]
Zapytanie.ParamByName('obrazek').AsBlob := buf;
[...]
end;
stream.Free;
end;
W zmiennej buffer jest już niepoprawna zawartość bo gdy zapisuję ją do pliku to obrazek jest niepoprawny. Ale jeśli zrobię stream.SaveToFile(...) to obrazek wygląda prawidłowo.
A odczytuję z bazy tak:
var
buf: array[0..1000000] of char;
buffer: string;
jpg: TJPEGImage;
stream: TMemoryStream;
wielkosc: Integer;
begin
with Baza.ZapytanieSELECT do
begin
Open;
stream := TMemoryStream.Create;
while not Eof do
begin
wielkosc := FieldValues['wielkosc']; // wielkość danych w polu BLOB
buffer := FieldValues['obrazek'];
StrPCopy(buf, buffer);
stream.Write(buf, wielkosc);
obrazek := TJPEGImage.Create;
obrazek.LoadFromStream(stream);
Next();
end;
stream.Free;
Close();
end;
obrazek.SaveToFile('nazwa.jpg');
end;
No i oczywiście dane z pola BLOB są niepoprawne i obrazka nie ma :/
Błagam o pomoc bo siedzę na tym już parę godzin;)
Powiedzcie co robię źle.