Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: Maverich - Dicembre 27, 2014, 11:48:57 pm

Titolo: [Risolto] Caricare immagine (file) su Stream per salvare su campo Blob
Inserito da: Maverich - Dicembre 27, 2014, 11:48:57 pm
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

Codice: [Seleziona]
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.
Titolo: Re:Caricare immagine (file) su Stream per salvare su campo Blob
Inserito da: Stilgar - Dicembre 29, 2014, 09:17:36 pm
Il "post" del record dove lo fai?

Stilgar
Titolo: Re:Caricare immagine (file) su Stream per salvare su campo Blob
Inserito da: Maverich - Dicembre 30, 2014, 04:16:58 pm
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

Codice: [Seleziona]
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);

Codice: [Seleziona]
//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]
Titolo: Re:Caricare immagine (file) su Stream per salvare su campo Blob
Inserito da: nomorelogic - Dicembre 31, 2014, 06:16:42 pm
p.s. non  i ricordo come si fa ad indicare [Solved]

credo basti entrare in modifica del primo messaggio e cambiare l'oggetto