如何在网页上输出数据库的Jpeg图形字段?(100分)

  • 主题发起人 主题发起人 xiecc
  • 开始时间 开始时间
X

xiecc

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在网页上输出数据库的Jpeg图形字段?
用asp或isapi都行.
李维<电子商务篇>里用的是先将字段存成文件,再用《img src=''》来调用,但
我每页要显示几十张图片,那每次不是要保存几十图到文件里吗? 有没有更好的方法?
能不能直接将Stream写到Response?
 
可以(象记数器cgi返回图象)
header加:
Content-Type: image/jpeg

正文返回jpeg图片
 
Pipi:能说具体一点吗?我水平不太好
 
我写过一个 ISAPI 计数器,可能对你有帮助:

我的思路是:

先用TBitmap生成图形,
然后转存到TJPEGImage,
然后写到TMemoryStream,
最后用Response.SendStream()输出。

请看源代码:

unit main;

interface

uses
Windows, Messages, SysUtils, Classes, HTTPApp, Graphics, JPEG,
ImgList, Controls;

type
TWebCounter = class(TWebModule)
CountList: TImageList;
procedure WebCounteraCounterAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
WebCounter: TWebCounter;

implementation

{$R *.DFM}

procedure TWebCounter.WebCounteraCounterAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
FileName,Count:string;
CF:TextFile;
MS:TMemoryStream;
Bitmap:TBitmap;
i:integer;
begin
//读取并增加计数器的数字
FileName:=Request.QueryFields.Values['filename'];
FileName:='d:/inetpub/wwwroot/counter/data/'+FileName+'.txt';
if FileExists(FileName) then
begin
AssignFile(CF,FileName);
Reset(CF);
ReadLn(CF,Count);
Count:=IntToStr(StrToInt(Count)+1);
while Length(Count)<6 do
begin
Count:='0'+Count;
end;
Rewrite(CF);
WriteLn(CF,Count);
CloseFile(CF);
end;
//把字符转换为图形
Bitmap:=TBitmap.Create;
with Bitmap do
begin
Width:=72;
Height:=18;
for i:=0 to 5 do
begin
CountList.Draw(Bitmap.Canvas,i*11+3,3,StrToInt(Count[i+1]),true)
end;
end;
MS:=TMemoryStream.Create;
//转换为THPEGimage格式
with TJPEGImage.Create do
begin
Assign(Bitmap); //从TBitmap中复制
SaveToStream(MS); //转存到“内存流”
Free;
end;
MS.Position:=0; //这几句必不可少!!
Response.ContentType:='image/jpg'; //设置返回格式为:“image/jpg”
Response.SendResponse; //
Response.SendStream(MS); //从内存流中发送
MS.Free;
Bitmap.Free;
end;

end.

调用方法:

<p>您是第<img src="/scripts/counter.dll?webname=test">位访问者</p>

很容易就可把它改成CGI
 
调用方法是:
您是第<img src="/scripts/counter.dll?webname=test">位访问者
 
shangcm:我按你的思路做了如下程序:
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
s:TMemorystream;
begin
tblProducts.open;
S:=TMemoryStream.Create ;
try
TblobField(tblProducts.FieldByName('image')).SaveToStream(S);
S.Position:=0;
Response.ContentType :='image/jpeg';
Response.ContentStream :=S;
Response.SendResponse ;
finally
S.free;
end;
end;
然后再用《img src="images/showjpeg.dll"》结果什么也显示不出来,我的数据库是李维《delphi 5.x分布式多层应用 电子商务篇》光盘上products.db,请高手帮
我试试!
 
你的数据库保存的是否jpeg图片,图象格式很多
 
<%
' Clear out the existing HTTP header information
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
' Change the HTTP header to reflect that an image is being passed.
Response.ContentType = "image/jpg"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "esell_db","sa"
Set rs = conn.Execute("SELECT img FROM test WHERE id='11'")
Response.BinaryWrite rs("img")
Response.End
%>
 
用《IMG SRC="show.asp?id=xxx"》的方式显示,格式不限

而show.asp中主要有以下语句:


Response.ContentType = "image/*" '输出格式
Response.BinaryWrite XXX ‘用二进制方式输出
 
ISAPI真恶心,刚刚调试了不行,后来不知怎么又好了。我把我的代码贴出来供大家参考:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, HTTPApp,jpeg, Db, DBTables;

type
TWebModule1 = class(TWebModule)
Session1: TSession;
Database1: TDatabase;
Query1: TQuery;
procedure WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
WebModule1: TWebModule1;

implementation

{$R *.DFM}

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
s:TMemorystream;
begin
Query1.close;
Query1.ParamByName('pid').AsString:=Request.QueryFields.Values['Pid'];
Query1.open;
if Query1.RecordCount<1 then
exit;
S:=TMemoryStream.Create;
try
TblobField(Query1.FieldByName('image')).SaveToStream(S);
S.Position:=0;
Response.ContentType :='image/jpeg';
Response.ContentStream :=S;
Response.SendResponse ;
finally
S.free;
end;
end;

end.
调用方法:《img src="showjpeg.dll?pid=00001"》
将显示Key为"00001"的jpeg图形字段
 
Sorry ,还是不行,当同一页里有两张图时只显示第一张
我用
《img src="showjpeg.dll?pid=00001"》
《img src="showjpeg.dll?pid=00002"》
结果第二张图又变成空白了。我再试试

 
ISAPI调试太麻烦了
 
我在显示图形的时候也有这样的问题。

从道理上将,应该很清楚:
Response.ContentStream := TMemoryStream.Create;
.....
关键是TMemoryStream的内容。

但是我在尝试重复刷新的时候,发现图形显示的时候会出错。
而且,连续的刷新操作,可能造成IIS的DOWN。

我觉得这个问题与XIECC的有点相识。
有谁知道为什么?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部