|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
SQLServer是基于服务器端的中型的数据库,可以适合大容量数据的应用,在功能上管理上也要比Access要强得多。在处理海量数据的效率,后台开发的灵活性,可扩展性等方面强大。上传|详解文件上传是WEB开辟中常常要用到的功效,但ASP自己和内置的组件都不撑持文件上传功效。网下流传的一些第三方组件固然可以办理这个成绩,但年夜多是要免费的,更别说OpenSource了。本文将具体分析WEB文件上传的道理,和一步步引导读者怎样用Delphi6开辟一个ASP上传组件。
1Html文件剖析
起首我们来看一个html文件源码,文件名是test.htm,功效是供应用户上传的界面:
<html>
<body>
<center>
<formname="mainForm"enctype="multipart/form-data"
action="test.asp"method=post>
<inputtype=filename=mefile><br>
<inputtype=hiddenname=a1value="fdsaf">
<inputtype=hiddenname=a2value="fdsaf">
<inputtype=hiddenname=a3value="fdsaf">
<inputtype=hiddenname=a4value="fsdfsdsaf">
<inputtype=hiddenname=a5value="这个是这个">
<inputtype=textname=a6value="fdsaf">
<inputtype=submitname=okvalue="OK">
</form>
</center>
</body>
</html>
这个文件里包括了一个名为mainForm的form,和顺手写的一些input域。注重这个form和一样平常的form有两个分歧的中央:一是它有一个type=file的域,没有value。用扫瞄器翻开这个文件时,这个域会体现为一个右边有“扫瞄”字样的文件输出框,用户能够经由过程它来选择当地硬盘上的文件。二是form有一个特别的属性:enctype="multipart/form-data"。这个属性告知扫瞄器要上传二进制文件,并举行响应编码。
这类编码会发生甚么样的表单信息呢?让我们来看看test.asp,也就是承受表单的asp文件的源码,它十分复杂:
<%
formsize=request.totalbytes 取得表单原始信息的长度
formdata=request.binaryread(formsize) 读取表单原始信息
response.binarywriteformdata 前往表单原始信息
%>
如读者在正文中懂得的,这段代码的功效是将表单的原始信息前往。让我们来看看它的运转效果。将这两个文件置于web目次下,会见test.htm。在文件输出框中,选择一个文件(我选了一个jpg图片,不外最年夜不要太年夜)。提交,然后能够看到如许一堆七零八落的信息:
-----------------------------7d2227629012eContent-Disposition:form-data;name="mefile";filename="C:DocumentsandSettingsaaaMyDocumentsMyPictureszzjh.jpg"Content-Type:image/pjpeg(作者注:以下为乱码)-----------------------------7d2227629012eContent-Disposition:form-data;name="a1"fdsaf-----------------------------7d2227629012eContent-Disposition:form-data;name="a2"fdsaf-----------------------------7d2227629012eContent-Disposition:form-data;name="a3"fdsaf-----------------------------7d2227629012eContent-Disposition:form-data;name="a4"fsdfsdsaf-----------------------------7d2227629012eContent-Disposition:form-data;name="a5"这个是这个-----------------------------7d2227629012eContent-Disposition:form-data;name="a6"fdsaf-----------------------------7d2227629012eContent-Disposition:form-data;name="ok"OK-----------------------------7d2227629012e--
这就是用"multipart/form-data"体例编码的表单原始信息。个中那一段看起来是乱码的部分,就是jpg图片的编码。(实践的jpg图片编码大概要比这长很多,视文件巨细而定。为了行文便利,作者只保存了一小部分。)
剖析一下这段信息的格局:
-----------------------------7d2227629012e这是各个域之间的分开符。
Content-Disposition:form-data;申明这是表单中的域。
name="mefile";域的称号。
filename="C:DocumentsandSettingsaaaMyDocumentsMyPictureszzjh.jpg"上传文件在当地硬盘上的称号。
Content-Type:image/pjpeg文件范例。
前面是文件自己的数据。
别的各个域的信息也能够以此类推。
尽人皆知,在ASP中,利用request工具,能够会见用户提交表单的各个域。由于request工具会对原始的表单信息举行剖析,提掏出表单中每一个域的值。可是,request其实不能剖析这"multipart/form-data"格局的表单信息。这就是ASP不克不及间接撑持文件上传的缘故原由地点。读者能够尝尝,在test.asp中,用request("mefile")如许的格局,是不克不及读取到准确的信息的。
成绩的关键已找到,办理的思绪也很复杂:用Delphi开辟一个COM组件,承受这类原始表单信息,将各个域逐一提掏出来,前往给asp文件。也就是完成request工具没有完成的功效。
2用Delphi开辟组件
Delphi6对开辟ASP组件供应了极好的撑持,年夜年夜简化了我们的开辟历程。
启动Delphi6,选择File-New-Other-ActiveX-ActiveXLibrary,如许就创建了一个ActiveX库。将此Library更名为myobj,存盘。选择File-New-Other-ActiveX-ActiveServerObject,在CoClassname中填进upfile,断定。这时候会跳出一个题目为myobj_tlb的对话框,这是Delphi独有的以可视化体例编纂COM接口的功效,用Delphi开辟过COM的读者应当对照熟习。
在myobj下的名为Iupfile的Interface下,增加5个属性和一个办法。假如不明白怎样操纵,请拜见Delphi参考书的相干部分。按F12能够看到天生的响应的myobj_tlb.pas文件,个中的Iupfile接口应当是这个模样:
Iupfile=interface(IDispatch)
[{5C40D0EB-5A22-4A1E-8808-62207AE04B51}]
procedureOnStartPage(constAScriptingContext:IUnknown);safecall;
procedureOnEndPage;safecall;
functionGet_Form(Formname:OleVariant):OleVariant;safecall;
functionGet_FileName:OleVariant;safecall;
functionGet_FileSize:Integer;safecall;
procedureFileSaveAs(FileName:OleVariant);safecall;
functionGet_FileData:OleVariant;safecall;
functionGet_FileType:OleVariant;safecall;
propertyForm[Formname:OleVariant]:OleVariantreadGet_Form;
propertyFileName:OleVariantreadGet_FileName;
propertyFileSize:IntegerreadGet_FileSize;
propertyFileData:OleVariantreadGet_FileData;
propertyFileType:OleVariantreadGet_FileType;
end;
个中的OnStartPage办法和OnEndPage办法是Delphi默许天生的,别的的是手动到场的。
切换到unit1.pas(也是Delphi主动天生的),更名为upfile.pas存盘。能够看到存在一个Tupfile类的声明,它是承继自TASPObject类和Iupfile接口的。Delphi6已主动天生了响应的代码。接上去的义务就是完成这个接口。
除完成Iupfile接口中的属性和办法以后,还必要增补一些器材,以便完成我们的义务。终极的Tupfile类的声明以下:
Tupfile=class(TASPObject,Iupfile)
public
protected
procedureOnEndPage;safecall;//页面入手下手
procedureOnStartPage(constAScriptingContext:IUnknown);safecall;//页面停止
procedureFileSaveAs(Filename:OleVariant);safecall;//保留文件
functionGet_Form(Formname:OleVariant):OleVariant;safecall;//
functionGet_FileName:OleVariant;safecall;
functionGet_FileSize:Integer;safecal
缺点:正版成本价格贵(盗版就不说了)、不够安全,大多数服务器用windows系统,没有linux安全 |
|