Usando TMemoryStream ed il metodo LoadFromFile, traferisco sempre un file Jpeg su TMemoryStream
Utilizzando invece TStream o TFileStream, trovo che lo stream creato ha sempre Size = 0 segno
evidente che lo stream non contiene il file .jpeg
procedure InsertFile(sFile: string);
var BlobStream: TStream;
FileStream: TStream;
begin
//es: sFile := 'D:\Immagini\File1.Jpg' // circa 2 Mb
ZQuery1.Insert;
BlobStream := ZQuery1.CreateBlobStream(ZQuery1.FieldByName('IMMAGINE'), bmWrite);
try
FileStream := TFileStream.Create(sFile, fmOpenRead);
try
BlobStream.CopyFrom(FileStream, FileStream.Size);
finally
FileStream.Free;
end;
finally
BlobStream.Free;
end;
ZQuery1.Post;
non ci sono errori, ma nel Db trovo il campo Blob 'IMMAGINE' = null
preso spunto dagli esempi delle zeos, progetto ZBlob.
ho risolto come segue; ora posso pasare al Blob tramite File stream qualunque tipo di file, non solo jpeg, bmp
la dimensione del file risulta sempre corretta, e sulla tabella risultano scritti sia il Blob che la dimensione del file.
rispetto a prima ho cambiato la dichiarazione dello stream da TStream a TFileStream
var
fStream: TFileStream; //in precedenzsa TStream
....
//crea fileStream partendo da path+nomefile+estensione
fStream := TFileStream.Create(sNomeFile, fmOpenread);
//passa FileStream alla procedure di inserimento
frm_DatiImmagini.InserisceImmagine(fStream, sNomeFile, bScriviImg);
//riceve lo stream come parametro
procedure Tfrm_DatiImmagini.InserisceImmagine(fStream: TFileStream; sFile: string; bScriviImg: boolean);
var Blob: TStream;
//unit che contiene ZConnection
frm_ConnettiDb.ZConnection1.AutoCommit := true;
frm_ConnettiDb.ZConnection1.StartTransaction;
ZQuery1.Insert;
ZQuery1.FieldByName('ID').AsInteger := Get_ID;
ZQuery1.FieldByName('DATA').AsDateTime := dData;
ZQuery1.FieldByName('NOMEFILE').asString := sFile;
ZQuery1.FieldByName('DIMENSIONE').AsInteger := fStream.Size;
//(ZQuery1.FieldByName('IMMAGINE') as TBlobField).LoadFromStream(fStream);
//crea il blob
Blob := ZQuery1.CreateBlobStream(ZQuery1.FieldByName('IMMAGINE'), bmWrite);
try
Blob.Seek(0, soFromBeginning);
Blob.CopyFrom(fStream, fStream.Size) ; //trasferisce lo stream su Blob
finally
Blob.Free;
end;
try
ZQuery1.Post;
frm_ConnettiDb.ZConnection1.Commit;
except
frm_ConnettiDb.ZConnection1.Rollback;
end;
p.s. non i ricordo come si fa ad indicare [Solved]