miércoles, octubre 25, 2006

Desplegar una imagen JPG dinámicamente desde una Base de Datos SQL en Delphi

Hace algunos años tuve la necesidad en mi trabajo de hacer un aplicación que desplegara dinámicamente una imagen JPG que se encontraba almacenada en una base de datos MS SQL, y otra imagen identica almacenada en una base de datos DB2. Indagando entre los ejemplos y tutoriales de Delphi me encontre un ejercicio para generar "on-the-fly" una imagen BMP, de ahi me surgio la idea de hacer eso mismo para la imagen JPG.


La solución es una aplicación web ISAPI/DLL, la cual puede ser utilizada desde cualquier archivo HTML usando el tag <IMG..> indicando en la propiedad src el url donde se encuentra la imagen, en este caso no seria una dirección aboluta sino relativa, una llamada a la ISAPI que había creado. Esto me dió la ventaja de poder utilizar dicha DLL tanto en ASP, como en JSP, dándome una enorme ventaja sobre otras alternativas. Además de que la DLL se ejecuta muy rápidamente en comparación con algun servlet o una ASP simple.


La estructura de la solución se ilustra en el siguiente diagrama de clase:



Y la lógica básica en este diagrama de secuencia:

A continuación escribimos el código fuente de Delphi, para la versión 6 y 7:
----




library ShowSignImage;

uses
ActiveX,
ComObj,
WebBroker,
ISAPIThreadPool,
ISAPIApp,
uShowSignImage in 'uShowSignImage.pas' {WebModule1: TWebModule};

{$R *.res}

exports
GetExtensionVersion,
HttpExtensionProc,
TerminateExtension;

begin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.





----


----


unit uShowSignImage;

interface

uses
SysUtils, Classes, HTTPApp, DB, ADODB;

type
TWebModule1 = class(TWebModule)
con: TADOConnection;
q: TADOQuery;
qSUCURSAL: TFloatField;
qACCOUNT: TStringField;
qNUMIMAG: TStringField;
qIMAGE: TBlobField;
procedure WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
WebModule1: TWebModule1;

implementation

uses
Windows, ShellAPI;

const
MAX_PATH = 255;
{$R *.dfm}

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);


var
S: TMemoryStream;
sucursal, cuenta, numfirma: string;

begin
try
S := TMemoryStream.Create;
try
// get url parameters
sucursal := Request.QueryFields.Values['sucursal'];
cuenta := Request.QueryFields.Values['cuenta'];
numfirma := Request.QueryFields.Values['numimag'];

q.Parameters[0].Value := StrToFloat(sucursal);
q.Parameters[1].Value := StrToFloat(cuenta);
q.Parameters[2].Value := StrToFloat(numfirma);
q.Open;
try
S.Position := 0;

qIMAGE.SaveToStream(S);

S.Position := 0;
Response.ContentType := 'image/jpeg';

Response.ContentStream := S;
Response.SendResponse;
finally
q.Close;
end;
finally
S.Free;
end;
except
on E: Exception do
Response.Content := '<html><body>Ocurrio un error (' +
E.ClassName + ': ' + E.Message + ')</body></html>';
end;
end;

end.






----



Technorati : , ,

No hay comentarios.:

Publicar un comentario