WEB开发网
开发学院WEB开发ASP 用Delphi 6开发ASP上传组件详解 阅读

用Delphi 6开发ASP上传组件详解

 2007-12-09 12:51:04 来源:WEB开发网   
核心提示:FFormInfo:TStringList;function instr(str1,str2:string;startpos:integer):integer;procedure AnalyFormData(content:string);end;下面我们来一一分析这些成员的具体实现,procedure Tupfile

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环境下,也可以方便地调用它们,就象在ASP中一样,例如Request.TotalBytes。首先将原始表单数据读入到一个OleViarians类型的tmpvar中,然后通过一个循环,将它转换为Delphi中的string格式,并存放在FContentData中。
  接下来,通过查找换行符,解析出分隔符的内容和长度。然后在一个循环中,用AnalyFormData成员函数一一解析出每个域。初始化工作就这样完成了。

  再看AnalyFormData函数的实现:

procedure Tupfile.AnalyFormData(content: string);
var
pos1,pos2:integer;
FormName,FormValue:string;
isFile:boolean;
begin
isFile := false;
pos1 := instr('name="',content,1)+6;
pos2 := instr('"',content,pos1);
FormName := copy(content,pos1,pos2-pos1);

//检查是否文件
pos1 := instr('filename="',content,pos2+1);
if pos1 <> 0 then
begin
isFile := true;
pos1 := pos1 + 10;
pos2 := instr('"',content,pos1);
FFilename := copy(content,pos1,pos2-pos1);
end;

pos1 := instr(#13#10#13#10,content,pos2+1)+4;
FormValue := copy(content,pos1,length(content)-pos1);

if isfile then
begin
FFileData := FormValue;
//查找文件类型信息
pos2 := instr('Content-Type: ',content,pos2+1);
if pos2 <> 0 then
begin
pos2 := pos2 + 14;
FFileType := copy(content,pos2,pos1-4-pos2);
end;
end
else
begin
FFormInfo.add(FormName+'='+FormValue);
end;
end;

  如注释中所表达的,AnalyFormData提取原始数据中的域。如果是域是文件类型,则将文件类型和文件数据分别放入FFileType和FFileData中。如果是其它类型,则将名称和值放入一个TStringlist类型的FFormInfo中。FFormInfo中维护着除文件类型外的所有域的信息,以“名称=值”的格式存放。
  
function Tupfile.Get_Form(Formname: OleVariant): OleVariant;
begin
Result := FFormInfo.Values[Formname];
end;

  这个函数返回域的值。只需要简单地调用FFormInfo的values方法,就可以得到相应的值。这是在Tstringlist类内部实现的。

function Tupfile.Get_FileName: OleVariant;
begin
Result := ExtractFileName(FFileName);

上一页  1 2 3 4  下一页

Tags:Delphi 开发 ASP

编辑录入:coldstar [复制链接] [打 印]
赞助商链接