用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.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);
- ››ASP.NET及JS中的cookie基本用法
- ››Delphi实现把10进制转换成16进制的函数进制转化
- ››ASP.NET获取MS SQL Server安装实例
- ››Delphi中将字符串按给定字符分隔(似split函数功能...
- ››Delphi 动态创建窗体,锁定窗口赋值
- ››开发Android 日历教程
- ››开发学院总结 Win 8实用技巧大全
- ››asp.net实现调用百度pai 在线翻译英文转中文
- ››ASP.NET页面选项进行提示判断
- ››Asp.net定时执行程序
- ››开发学院原创教程:把win8的IE10放桌面上方法(非...
- ››ASP.NET中利用DataList实现图片无缝滚动
更多精彩
赞助商链接