生成的,其它的是手动加入的。
切换到unit1.pas(也是Delphi自动生成的),改名为upfile.pas存盘。可以看到存在一个
Tupfile类的声明,它是继承自TASPObject类和Iupfile接口的。Delphi 6已经自动生成了相应
的代码。接下来的任务就是实现这个接口。
除了完成Iupfile接口中的属性和方法之后,还需要补充一些东西,以便完成我们的任务。最终的
Tupfile类的声明如下:
Tupfile = class(TASPObject, Iupfile)
public
protected
procedure OnEndPage; safecall; //页面开始
procedure OnStartPage(const AScriptingContext: IUnknown); safecall; //页面
结束
procedure FileSaveAs(Filename: OleVariant); safecall; //保存文件
function Get_Form(Formname: OleVariant): OleVariant; safecall; //
function Get_FileName: OleVariant; safecall;
function Get_FileSize: Integer; safecall;
function Get_FileData: OleVariant; safecall;
function Get_FileType: OleVariant; safecall;
private
FContentData:string;
FFileData,FFileName,FFileType:string;
FFormInfo:TStringList;
function instr(str1,str2:string;startpos:integer):integer;
procedure AnalyFormData(content:string);
end;
下面我们来一一分析这些成员的具体实现。
procedure Tupfile.OnStartPage(const AScriptingContext: IUnknown);
var
AOleVariant : OleVariant;
tmpvar : OleVariant;
contentlength : integer;
i,DeliCount,pos1,pos2,lastpos : integer;
FDelimeter : string;
begin
inherited OnStartPage(AScriptingContext);
FFormInfo := TStringList.Create;
contentlength := Request.TotalBytes;
AOleVariant := contentlength;
tmpvar := Request.BinaryRead(AOleVariant);
for i := 1 to contentlength -1 do
begin
FContentData := FContentData + chr(byte(tmpvar[i]));
end;
pos1 := pos(#13#10,FContentData);
FDelimeter := copy(FContentData,1,pos1+1);
DeliCount := length(FDelimeter);
lastpos := 1;
pos1:=0;
while pos2>=pos1 do
begin
pos1 := instr(FDelimeter,FContentData,lastpos);
if pos1 = 0 then Break;
pos1 := pos1 + DeliCount;
pos2 := instr(FDelimeter,FContentData,pos1)-1;
AnalyFormData(copy(FContentData,pos1,pos2-pos1-1));
lastpos := pos2;
end;
end;
前面说过,OnStartPage方法是Delphi自动生成的,在装载页面时发生。在这个方法中,我们完
成一些初始化的任务:读取表单的原始数据,解析表单中的域,并存入相应的属性中,以备调用。
由于Delphi已经对ASP中的对象进行了很好的封装,所以即使在Delphi环境下,也可以方便地调
用