分享
 
 
 

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

王朝vc·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

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

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

首先我们来看一个html文件源码,文件名是test.htm,功能是提供用户上传的界面:

<body>

<center>

<form name="mainForm" enctype="multipart/form-data"

action="test.asp" method=post>

<input type=file name=mefile><br>

<input type=hidden name=a1 value="fdsaf">

<input type=hidden name=a2 value="fdsaf">

<input type=hidden name=a3 value="fdsaf">

<input type=hidden name=a4 value="fsdfsdsaf">

<input type=hidden name=a5 value="这个是这个">

<input type=text name=a6 value="fdsaf">

<input type=submit name=ok value="OK">

</form>

</center>

</body>

</html>

formsize=request.totalbytes '获得表单原始信息的长度

formdata=request.binaryread(formsize) '读取表单原始信息

response.binarywrite formdata'返回表单原始信息

%>

Content-Disposition: form-data; 说明这是表单中的域。

name="mefile"; 域的名称。

filename="C:\Documents and Settings\aaa\My Documents\My Pictures\zzjh.jpg" 上传文件在本地硬盘上的名称。

Content-Type: image/pjpeg 文件类型。

后面是文件本身的数据。

在myobj下的名为Iupfile的Interface下,添加5个属性和一个方法。如果不懂得如何操作,请参见Delphi参考书的相关部分。按F12可以看到生成的相应的myobj_tlb.pas文件,其中的Iupfile接口应该是这个样子:

['{5C40D0EB-5A22-4A1E-8808-62207AE04B51}']

procedure OnStartPage(const AScriptingContext: IUnknown); safecall;

procedure OnEndPage; safecall;

function Get_Form(Formname: OleVariant): OleVariant; safecall;

function Get_FileName: OleVariant; safecall;

function Get_FileSize: Integer; safecall;

procedure FileSaveAs(FileName: OleVariant); safecall;

function Get_FileData: OleVariant; safecall;

function Get_FileType: OleVariant; safecall;

property Form[Formname: OleVariant]: OleVariant read Get_Form;

property FileName: OleVariant read Get_FileName;

property FileSize: Integer read Get_FileSize;

property FileData: OleVariant read Get_FileData;

property FileType: OleVariant read Get_FileType;

end;

除了完成Iupfile接口中的属性和方法之后,还需要补充一些东西,以便完成我们的任务。最终的Tupfile类的声明如下:

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;

var

AOleVariant : OleVariant;

tmpvar : OleVariant;

contentlength : integer;

i,DeliCount,pos1,pos2,lastpos : integer;

FDelimeter : string;

begin

inherited OnStartPage(AScriptingContext);

FFormInfo := TStringList.Create;

AOleVariant := contentlength;

tmpvar := Request.BinaryRead(AOleVariant);

for i := 1 to contentlength -1 do

begin

FContentData := FContentData + chr(byte(tmpvar[i]));

end;

FDelimeter := copy(FContentData,1,pos1+1);

DeliCount := length(FDelimeter);

lastpos := 1;

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;

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);

if pos1 <> 0 then

begin

isFile := true;

pos1 := pos1 + 10;

pos2 := instr('"',content,pos1);

FFilename := copy(content,pos1,pos2-pos1);

end;

FormValue := copy(content,pos1,length(content)-pos1);

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;

begin

Result := FFormInfo.Values[Formname];

end;

begin

Result := ExtractFileName(FFileName);

end;

begin

Result := length(FFileData);

end;

var

i:integer;

begin

Result := VarArrayCreate( [0,length(FFileData)], varByte );

for i := 0 to length(FFileData)-1 do

begin

Result[i] := Byte(FFileData[i+1]);

end;

end;

var

fsout:TFileStream;

begin

fsout := TFileStream.Create(Filename,fmcreate);

try

fsout.Write(Byte(FFileData[1]),Length(FFileData))

finally

fsout.Free;

end;

在命令行下,输入“regsvr32 myobj.dll”。弹出一个对话框,告诉你组件已经注册。如果找不到regsvr32.exe这个文件,它在windows\system32或winnt\system32目录下。

将本文开头提到的test.asp文件修改为如下内容:

Set upfile = Server.CreateObject("myobj.upfile")

response.write upfile.form("a2")&"<br>"

response.write upfile.form("a3")&"<br>"

response.write upfile.form("a4")&"<br>"

response.write upfile.form("a5")&"<br>"

response.write upfile.form("a6")&"<br>"

'获得文件类型

response.write "文件类型:"&upfile.filetype&"<br>"

%>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有