A small update - Don't ask me WHY - but get this - I take the exact same unchanged code, and insert an XPM image. It works perfectly. I try a jpg or a png - and it fails.
All I can imagine is that my b64decode function is broken - and that the breakage is ONLY affecting true binary sources, XPM (like my test program) is actually an ASCII format - so it survives the process intact - while png etc. fails. So - I guess I start hacking my b64decode function. A.J. On 5/16/07, A.J. Venter <[EMAIL PROTECTED]> wrote:
Hi again all Based on everyone's advice, I chose to go with base64 encoding - and started coding. Right now I am quite successfully: 1) Reading the image 2) Encoding it to base64 (using the encodeb64 function from the examples) 3) Storing the result in the database (I THINK it's storing right) Later I then select it, run it through decodeb64 (my own function based on the above, code below) and then save this string to a file - a file that has the right extension (the reason for this is actually good - remote DB access, and I want to cache the images and only download if they changed) Finally - a simple TImage.Picture.LoadFromFile is meant to handle the last bit... only it doesn't - somewhere along the way my data is corrupted - the files being dumped differ from the orriginals - yet oddly they are the exact same size. I know we're not supposed to include attachments on the list, so for now I didn't but if I may, I would like to add (assuming anybody says it would be usefull: 1) An orriginal image 2) A post database process filedump of the same image 3) The (apparently) base64 encoded database entry for said image I can say that I tested my b64encode/b64decode functions with a simple program that lets me enter string, encodes it, writes that, decodes THAT and writes it back (which should match the orriginal input) - that at least seems to work fine. Any idea where the corruption is coming from ? All help, as always, greatly appreciated. Relevant code snippets: Function DecodeB64(S : String) : String; Procedure doNothing; Begin end; var b64decoder: TBase64DecodingStream; S1 : TSTringStream; S2 : String; InputStream: TStream; IsEnd: Boolean; begin S1 := TStringStream.Create(S); S2 := ''; b64decoder := TBase64DecodingStream.Create(S1); While not B64Decoder.EOF do Begin try S2 := S2+(CHR(B64Decoder.ReadByte)); except doNothing; end; end; Result := S2; b64decoder.Free; end; Image Saving: Procedure SaveBTNClick(Sender:TObject); //Snipped Var B64 : String; S :TStringList; Begin S := TStringList.Create; S.LoadFromFile(ImgFileName); B64 := EncodeB64(S.Text); Ad.SaveData(add_desc.text,b64); end; Procedure TZC_Advertising.SaveData(Description,Data:String); Var Q : String; Begin Q := 'UPDATE advertising SET data='+QS(Data)+' timestamp='+QS('NOW')+' WHERE description = '+QS(Description)+' ;'; FResult := ZC_DBQuery(Q); //Notes: FResult is a PPGResult, ZC_DBQuery is a very well tested wrapper function //QS = QuoteString - it wraps the input in '' end; Image Loading: Function TZC_Advertising.GetData(Description:String):String; Var S : String; Begin FResult := ZC_DBQuery('SELECT data FROM advertising WHERE description = '+QS(Description)+';'); If PqNTuples(Fresult) >= 0 then begin S := PQGetValue(FResult,0,0); GetData:=DecodeB64(S); end else GetData := ''; end; //In the app: IName := GetTempDir+Ad.GetTimeStamp(add_desc.text)+Ad.GetExt(add_desc.text); Data := TStringList.Create; Data.Add(Ad.GetData(add_desc.text)); Data.SaveToFile(Iname); ad_Img.Picture.LoadFromFile(Iname); Data.Free; -- A.J. Venter CEO - OutKast Solutions C.C. http://www.outkastsolutions.co.za Cell: +27 83 455 9978 Fax: +27 21 413 2800 Office: +27 21 591 6766
-- A.J. Venter CEO - OutKast Solutions C.C. http://www.outkastsolutions.co.za Cell: +27 83 455 9978 Fax: +27 21 413 2800 Office: +27 21 591 6766 _________________________________________________________________ To unsubscribe: mail [EMAIL PROTECTED] with "unsubscribe" as the Subject archives at http://www.lazarus.freepascal.org/mailarchives