|
ASPUpload组件介绍 |
〖编辑:Cloudy | 浏览:人次〗 |
拷贝AspUpload.dll和所有.asp和.htm文件到你服务器的任何目录,如c:\AspUploadDir. 注册组件从MS DOS或Start/Run执行命令 REGSVR32 c:\AspUploadDir\AspUpload.dll 为了运行示例脚本,你需要将目录c:\AspUploadDir加入IIS虚拟目录清单中(使用Microsoft Managemant Console)开始 这是我们第一个html文件 Test1.htm <HTML> <BODY BGCOLOR="#FFFFFF"> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript1.asp"> <INPUT TYPE=FILE SIZE= 60NAME="FILE1"><BR> <INPUT TYPE=FILE SIZE= 60NAME="FILE2"><BR> <INPUT TYPE=FILE SIZE= 60NAME="FILE3"><BR> <INPUT TYPE=SUBMIT VALUE="Upload!"> </FORM> </BODY> </HTML>注意 在Form标记的属性 ENCTYPE="multipart/form-data" 他指示浏览器发送整个文件到服务器而不只是输入框内的文件名称。 你必须加上在Form标记内加上这个属性,否则将不能上传组件。让我们现在看看处理上传的脚本: UploadScript1.asp: <HTML> <BODY> <% Set Upload = Server.CreateObject("Persits.Upload.1") Count = Upload.Save("c:\upload") %> <% = Count %> files uploaded. </BODY> </HTML> 这段脚本的第一行简单创建了一个AspUpload对象的实例。第二行调用组件的真正实现功能的方法Save:处理浏览器传过来的数据,计算有多少文件被上传了,并把它们保存到指定的本地目录。目录名字可以以"\"结尾,也可以不是。所有文件会被以原来的文件名保存在那个目录下。 Save方法返回成功上传文件的数目,万一出错,这个方法将抛出一个例外(Exception),我们现在可以尝试着上载一些文件。注意:你可以使用表单上这3个输入框中的任何一个或者全部。ASPUpload会找出那个输入框是使用了的,而那个是没有使用的。让我们看一看一个例子的文件,test2.htm和UploadScript2.asp <HTML> <BODY BGCOLOR="#FFFFFF"> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript2.asp"> File 1:<INPUT TYPE=FILE NAME="FILE1"> Description 1:<INPUT TYPE= TEXTNAME="DESCR1"><BR> File 2:<INPUT TYPE=FILE NAME="FILE2"> Description 2:<INPUT TYPE= TEXTNAME="DESCR2"><BR> <INPUT TYPE=SUBMIT VALUE="Upload!"> </FORM> </BODY> </HTML> UploadScript2.asp <HTML> <BODY> <% Set Upload = Server.CreateObject("Persits.Upload.1") Upload.Save "c:\upload" %> Files:<BR> <% For Each File in Upload.Files Response.Write File.Name & "= " & File.Path & " (" & File.Size &")<BR>" Next %> <P> Otheritems:<BR> <% For Each Item in Upload.Form Response.Write Item.Name & "= " & Item.Value &"<BR>" Next %> </BODY> </HTML> 注意:我们的html Form现在有两种输入框,type=file和type=text。因为我们的表单使用了enctype属性,我们可以不再直接通过标准的ASP Request对象方法访问表单变量。 Form集合,由Upload.Form集合来代替。这个集合就等同Request.Form.也就是说,我们可以通过整数或字符串索引访问它的元素,例如:Set Item1 = Upload.Form("DESCR1") 或 Set Item1 = Upload.Form(1). 我们也可以像上面的例子那样使用For-Each语句,遍历集合中的所有元素。Form集合包含的类型为FormItem的对象,只有2个字符串的属性,Name和Value(缺省属性) 请记住,upload.Form集合只包括非文件的项目,也就是说非<input type=file>的表单项目。我们还有另外一个集合,叫Files,包含类型为UploadFile的对象,代表了从<input typ=file>上传的文件。Files很像Form集合,Files集合也可以使用字符串或者索引访问,或者通过 For-Each语句(如上面所示) 在运行了例子2之后,我们就会看到像这样的东西: Files: FILE1=c:\upload\File1.xls (108544) FILE2=c:\upload\File2.zip (211687) Other items: DESCR1=bla bla DESCR2=test test 注意:我们已经通过UploadFile对象的Path和size属性获得目的路径和上传文件的大小N 如果我们的表单只含有一个文件输入框,如:<INPUT TYPE=FILE NAME="ONLYFILE">,那么就用不着使用for-each语句,我们可以简单这么写: Response.Write Upload.Files("ONLYFILE").Path 或者更通常的可以用 Response.Write Upload.Files(1).Path 注意:除非Save方法被调用,否则Files和Form集合都是无效的。在调用Upload.Save之前调用,是错误的 ' 错误! Upload.Save( Upload.Form("Path") ) 文件大小设定限制 假定你需要限制上传文件的大小,以便防止不符责任的用户消耗你的硬盘空间。你需要做的只是在调用Save之前,使用SetMaxSize方法。 Set Upload = Server.CreateObject("Persits.Upload.1") Upload.SetMaxSize 50000, False Upload.Save "c:\upload" 在这个例子里面我们限制了上传文件为50000字节。这个可选的第二个参数指定是否一个文件大于最大字节数时候是被截断。(如果设置为fase,或者忽略。)或者遇上错误就放弃(如果设置发false)强制唯一的文件名 LoadManager OverwriteFiles false Upload.OverwriteFiles = False 这个属性缺省是true 为防止名字冲突,ASPUpload会在原有文件名之后加上一个括号内的整数。例如:如果MyFile.txt已经存在在upload目录下了,然后又上传了同名的文件,ASPUpload会把新文件存为 MyFile(1).txt . 如果我们上传更多的Myfile.txt,它们会被保存为MyFile(2).txt,MyFile(3).txt等等。处理文件属性和访问控制列表 ASPUpload使你可以修改文件的属性,以及访问控制列表(ACLs),一旦它们被下载完。下面一些文件(test3.htm和UploadScript3.asp)将说明这些功能。 <HTML> <BODY BGCOLOR="#FFFFFF"> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript3.asp"> <INPUT TYPE=FILE SIZE= 60NAME="FILE1"><BR> <INPUT TYPE=FILE SIZE= 60NAME="FILE2"><BR> <INPUT TYPE=FILE SIZE= 60NAME="FILE3"><BR> <INPUT TYPE=SUBMIT VALUE="Upload!"> </FORM> </BODY> </HTML><!--#include file="AspUpload.inc"--> <HTML> <BODY> <% Set Upload = Server.CreateObject("Persits.Upload.1") Upload.Save "c:\upload" For Each File in Upload.Files File.Attributes = FILE_ATTRIBUTE_READONLY + FILE_ATTRIBUTE_HIDDEN File.AllowAccess "Domain1\ppersits", GENERIC_ALL File.DenyAccess "jsmith", GENERIC_ALL Next %> Success! </BODY> </HTML> 文件Test3.htm实际上和Test1.htm是一致的。文件UploadScrip3.asp以这一行开始: <!--#include file="AspUpload.inc"--> 它指示ASP程序包含文件ASPUpload.inc到这个页面。这个文件包含一些你可能需要用来处理文件属性和ACLs的Windows NT常量定义。 这一行 File.Attributes = FILE_ATTRIBUTE_READONLY + FILE_ATTRIBUTE_HIDDEN 会设置文件属性为隐藏和只读。属性Attributes是可读可写的。所以这种用法是完全合法的: File.Attributes = File.Attributes + FILE_ATTRIBUTE_READONLY 如果你想增加一个新的属性,不改动原有的属性 语句 File.AllowAccess "Domain1\ppersits", GENERIC_ALL File.DenyAccess "jsmith", GENERIC_ALL 增加一个访问许可入口(ACE) 以及一个文件的访问控制列表增加一个拒绝访问ACE. 你也可以使用 RevokeAllowance 和 RevokeDenial 去除访问许可和从文件访问控制列表拒绝ACEs. 可以使用SetOwner方法设置文件的所有者 属性和ACL处理方法是受Windows NT安全性限制约束的。在使用这些方法之前,你可能需要使用LogonUser方法来模拟NT系统管理员的登录。移动,拷贝和删除文件 假定你需要限制上传文件的大小,以便防止不符责任的用户消耗你的硬盘空间。你需要做的只是在调用Save之前,使用SetMaxSize方法。 file.Move( NewName As String ) file.Copy( NewLocation As String, Optional Overwrite) file.Delete. Move方法依赖于参数NewName,要么将文件移动到一个其他目录,要么给文件改名。 假设文件abc.txt已经别上传到目录 c:\upload目录下,调用 file.Move "c:\WINNT\abc.txt" 会把文件移动到目录 c:\WINNT下, 而这样调用 file.Move "c:\Upload\xyz.txt" 会将文件简单改名。Move方法还有一个作用:一旦这个方法被成功调用了之后,文件对象的Path属性会指到新的位置/名字。 拷贝方法拷贝文件到一个新的位置/名字。newLocaiton必须是一个完全的路径。overwrite参数,如果别设置为true(缺省) ,指示copy方法覆盖新位置已经存在的文件,如果该参数别设置为false,如果新位置已经存在一个文件的话,方法调用将失败。与move不同的是这个方法不会影响path属性。 某些情况下你可能选择使用Delete方法,例如你将文件作为BOLB保存进数据库了,不在需要把它放在上传目录下了。将文件保存入数据是我们的下一个话题。保存文件进数据库 AspUpload允许你将上传的文件保存到一个数据库,代码少到一行! 让我们来看看下面的例子程序。Test4.htm和test1.htm几乎是相同的,我们就不用写出来了。文件UploadScript4.asp的内容 <HTML> <BODY> <% Set Upload = Server.CreateObject("Persits.Upload.1") Upload.Save "c:\upload" On Error Resume Next For Each File in Upload.Files File.ToDatabase "DSN=data;UID=sa;PWD=xxx;", "insert into Blobs(id, Path, BigBlob) values(12, '" & File.Path & "', ?)" if Err <> 0 Then Response.Write "Error saving the file: " & Err.Description Else File.Delete Response.Write "Success!" End If Next %> </BODY> </HTML> 这行代码 On Error Resume Next 指示asp程序在错误发生的时候不要显示错误信息,但是将错误码和描述保存进内置的对象,继续执行后面的代码。 然后一行 File.ToDatabase "DSN=data;UID=sa;PWD=xxx;", "insert into Blobs(id, Path, BigBlob) values(12, '" & File.Path & "', ?)" 是将文件保存于数据库。让我们检查这个方法所使用的两个参数: 第一个参数是一个ODCB连接串,按照下面的格式: "DSN=datasource;UID=userid;PWD=password;<other optional parameters>" 第二个参数是一个含有问号的sql Insert或Update语句,问号作为文件保存的占位符号。在这个例子里面,我们假设数据库的表Blobs有3个列:int ID ,varchar PATH,image BigBlob.这个sql Insert语句把12存入字段ID,文件路径存入Path字段,实际的文件存入BigBlob列中。 然后一行在成功执行之前检查是否语句正确。如果成功了,err对象是0,因为文件存入了数据库,不用再保存在上传目录了,文件会被删除(行:file.delete)。否则err包含一个数字的错误代码,并且err.description包含错误的信息。 为了保存你硬盘上的任意文件到数据库,使用uploadManager.ToDatabaseEx方法(1.4版本的新功能),它将一个文件路径作为第一个参数。其他两个参数和FielToDatabase一样。 Upload.ToDatabaseEx "c:\myfile.txt", "DSN=data;UID=sa;PWD=;", "insert into..."Exporting Files from the Database 从数据库中导出文件 在数据库的表内保存GIF,JPEG图片是常见的事情。为了从数据库表中获得一个图片,并在一个html page上显示。你不需要使用任何第三方的组件。ADO就可以帮你做到。 <IMG SRC="GetImage.asp?id=4"> GetImage.asp脚本可以是这么写的: <% Set db = Server.CreateObject("ADODB.Connection") db.Open "data" Set rs =db.Execute("SELECT BigBlob FROM Blobs where id = " & Request("id") ) Response.ContentType = "image/jpeg" '(or "image/gif") Response.BinaryWrite rs("BigBlob") %> 要从数据库把BLOB导出到你的硬盘上,你可以使用方法 Upload.FromDatabase,这个方法,只需以行代码就可以导出。 Preserving "Last Modified" Date/Time Information of Uploaded Files 保留"最后修改"日期/上传文件的信息 浏览器不会在上传文件的时候发送最后修改时间,因为不是RFC-1867所制定内容的部分。所以如果你使用基于表单的文件上传,这文件日期不能保留。但是如果你使用Persits Software 客户端上传工具XUopload ActiveX控件,则可以实现这项功能。详细请参考下载包里面的文档。加密支持 和另外一个组件AspEncrypt结合在一起就可以对文件上传进行加密。详细请参考下载包里面的文档。这里就不多废话了。 附加特性:目录清单列表,下载,ActiveX注册 ASPUpload还提供了3个额外的特性,虽然和文件上传关系不是很大,但是十分实用:目录列表,文件下载和ActiveX注册。目录清单列表 除了Form和Files集合,UploadManager还提供了一个集合,Directory,它代表你硬盘上的一个文件目录。与Form和Files不同的是,Directory不需要调用Save方法来计算大小 Directory集合包含DirectoryItem对象。每一个DirectoryItem对象代表一个这个目录下的文件或子目录。所有文件和子目录总是组合在一起的。子目录可以在集合里面继续处理文件(with subdirectories preceding files in the collection.)。在子目录和文件组内,各个元素可以按照名字,类型,大小,创建时间,最后修改时间和最后访问时间排序。元素总是按照升序排序。 下面的代码创建并浏览一个目录集合(C:\mydir),以文件类型进行排序 <% Set Upload = Server.CreateObject("Persits.Upload.1") Set Dir = Upload.Directory( "c:\mydir\*.*", SORTBY_TYPE) For Each item in Dir Response.Write item.FileName &"<BR>" Next %> |
录入时间:2006-11-01 12:59:45 [打印本页]
[关闭窗口]
[返回顶部] |
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
|
|