9.1.1.1 ChinaASP File Upload组件
ChinaASP File Upload是一个ChinaASP自己开发的组件。目前的版本是beta3
功能特点:
1. 支持上传多个文件
2. 可以将上传的文件改名保存
3. 可以同时使用其它的form input,携带附加的信息,例如,文件说明。
4. 可以判断上传文件的大小、文件类型
5. 支持将文件内容保存进数据库
6. 无需IIS将目录设置为Write(如果是NTFS文件系统,其安全性需要设置,可以简单的设置为everyone full control,或者设置为IUSR_SERVER full control)
7. 测试版本没有日期限制
下载:
http://www.chinaasp.com/program/fileup.htm
适用系统:
NT4.0 server 中文版 + IIS 4 或者 Windows 98/95 中文版 + Personal Web Server
组件的使用
set FileUp=server.createobject("ChinaASP.UpLoad")
组件的属性
编号
|
属性
|
读/写
|
描述
|
1
|
Files
|
只读
|
返回一个Collection对象,包含上传文件的信息(ContentType、文件名、上传Form内的Input名称、文件大小、及文件的两进制内容)
|
2
|
Form
|
只读
|
返回一个Collection对象,包含上传form内其他类型input(text/button等)的内容(form内input名称、该input的value)
|
3
|
UsedTime
|
只读
|
Com处理上传信息所使用的时间
|
4
|
CopyrightInfo
|
只读
|
版权信息
|
表9.3.3.1-1 FileUp组件属性列表
Files元素的属性
编号
|
属性
|
读/写
|
描述
|
1
|
ControlName
|
只读
|
上传Form内对应的file类型input的名称
|
2
|
IsEmpty
|
只读
|
是否是Empty,如果上传Form的file类型的input没有输入任何路径,则上传后其对应的files元素的IsEmpty值就为true,反之为false
|
3
|
FileName
|
只读
|
上传的原文件名
|
4
|
FileSize
|
只读
|
文件大小,如果上传的原文件不存在,则FileSize为0
|
5
|
ContentType
|
只读
|
上传文件内容的Mime类型,如text/plain
|
6
|
FileContent
|
只读
|
文件的两进制内容
|
表9.3.3.1-2 FileUp组件Files元素属性列表
Files元素的方法
SaveAs filename filename是是文件路径,如果是url,需要用server.mappath()进行转化
Form元素的属性
编号
|
属性
|
读/写
|
描述
|
1
|
ControlName
|
只读
|
上传Form内对应的file类型input的名称
|
2
|
Value
|
只读
|
Value
|
表9.3.3.1-3 FileUp组件Form元素属性列表
程序范例
上传Form的写法:
<form enctype="multipart/form-data" method="post" action="Upload.asp" name="Upload">
<input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com"><p>
上载测试,请选择文件</p>
<p>上传文件:<input type="file" name="file"><br>
</p>
<p>上传文件:<input type="file" name="file2"></p>
<p>写两句:</p>
<p><textarea id="TEXTAREA1" name="TEXTAREA1" style="HEIGHT: 86px; WIDTH: 339px" rows="1"
cols="20">
</textarea><br>
</p>
<p><input type="submit" value="Upload" name="B1"></p>
</form>
说明:
1. form必须加上 enctype=”multipart/form-data” 并且method必须是post
2. 如果要上传多个文件,只需放入类型为 file的input, 请为它们起不同的名字(name)
3. 在上传Form内必须加上<input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com">,否则上传组件将不能正常使用
Upload.asp程序(处理上传的文件内容)
<%@ LANGUAGE="VBSCRIPT" %>
<%
'---------------------------------------------------------------------------------
' ChinaASP File Upload Component For ASP beta 3 (build 33)
' 浏览器IE4、IE5、Netscape4、Opera3.51上测试通过
set FileUp=server.createobject("ChinaASP.UpLoad")
WriteLn "Total files found: " & fileup.Files.Count
writeln ""
dim iCount
iCount=0
for each f in fileup.Files
writeln "formField =" & f.controlName
‘ f.isempty=true 说明 上传使用的input(type=file)没有输入文件路径
if f.isempty=false then
writeln "filename ="&f.filename
writeln "filesize ="&f.filesize &" byte(s)"
writeln "contenttype=" & f.contenttype
‘ 如果文件路径不存在,那么该文件filezie就是0
if f.filesize<>0 then
writeln "SaveAs="&server.MapPath("upload/") & _
"\file"&cstr(iCount)&"."&getFileExtName(f.fileName)
'下面的语句用于将文件内容保存到sql server 7内。
else
writeln "Filesize=0 file not saved"
end if
f.saveas server.MapPath("upload/") & _
"\file"&cstr(iCount)&"."&getFileExtName(f.fileName)
else
writeln "This field is empty"
end if
writeln ""
iCount=iCount+1
next
'也可以这样使用 "file"是 上传form内input type=file 的field name
'writeln fileup.files("file").FileName
WriteLn "Total Inputs found: " & fileup.Form.Count
writeln ""
for each formField in fileup.Form
writeln "formField =" & formField.controlName
writeln "Value =" & formField.value
writeln ""
next
writeln "Time Used :" & fileup.UsedTime & " second(s)"
writeln ""
writeln(fileup.CopyrightInfo)
set fileup=nothing
sub WriteLn(str)
Response.Write str & "<br>"
end sub
'获得文件的后缀名
function getFileExtName(fileName)
dim pos
pos=instrrev(filename,".")
if pos>0 then
getFileExtName=mid(fileName,pos+1)
else
getFileExtName=""
end if
end function
%>
如何将上传的文件内容保存进数据库
如果你使用sql server,需要定义一个image类型的字段
dim conn,rs
set conn=server.CreateObject("adodb.connection")
conn.open "testfile","sa","xxx"
‘ sa是sql server 登录名,xxx是其密码,你可以将它们改成你自己的设置
set rs=server.CreateObject("adodb.recordset")
rs.Open "SELECT * FROM [file] where filename is null",conn,1,3
rs.AddNew
rs("filename")=f.filename
rs("filesize")=f.filesize
rs("filecontent").AppendChunk f.filecontent ‘BLOB数据不能直接赋值
rs.Update
rs.Close
conn.Close
set rs=nothing
set conn=nothing
相反的要将数据从数据库里面取出来,请参考下面的程序
dim conn,rs
dim content
set conn=server.CreateObject("adodb.connection")
conn.open "testfile","sa","xxx"
set rs=server.CreateObject("adodb.recordset")
rs.Open "SELECT * FROM [file] where id =" & id,conn,1,1
content=rs("filecontent").getChunk(clng(rs("filesize")))
conn.Close
set rs=nothing
set conn=nothing
如果是图形文件要显示的话
response.contenttype="image/gif" ' or image/jpeg
response.binarywrite rs("filecontent").getChunk(clng(rs("filesize")))
9.1.1.2 ASP Upload组件
简要介绍
AspUpload 1.4是一个ASP组件,它使ASP应用程序可以接受,保存,和处理浏览器上传的文件。 文件通过HTML Post表单使用<input type=file>标记上传。ASPUpload组件可以被在运行IIS的Windows NT Server ASP脚本调用,或者运行PWS的Windows 95/98上的ASP脚本也可以调用(需要ASP 1.0b以上版本)。组件处理浏览器传递过来的数据,并将收到的文件保存于服务器的硬盘上。ASPUpload可以以多种方式处理上传的文件:包括ACL(Access Control List 访问控制列表)处理,属性更改,保存到数据库,ActiveX Dll注册等等。
你的浏览器必须符合RFC 1867才能上传文件:如:Netscape 3.0+ or Microsoft IE4.0+ 或者安装了File upload add-on补丁的ie3.0
安装ASPUpload和示例
拷贝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
%>
Directory属性第一个参数是一个目录名字和一个带统配符号的文件名。第二个参数是可选的,如果使用了,必须被设置为在aspUpload.inc重定义的Sort-by值。缺省的值是SORTBY_NAME(数字1)
正如我们刚才提到的那样,集合的元素总是被按照升序排序的。如果你需要对文件列表按照倒序列出来,你不得不使用数字索引向后遍历,而不是使用For-each语句。例如:
<%
Set Upload = Server.CreateObject("Persits.Upload.1")
Set Dir = Upload.Directory( "c:\mydir\*.*", SORTBY_TYPE)
For i = Dir.Count To 1 Step -1
Response.Write Dir(i).FileName &"<BR>"
Next
%>
这段代码会显示所有文件(跟着目录),并且文件和目录按照降序排列。
文件下载
有时候让用户下载没有放在IIS虚拟目录下的文件可能十分必要。你可以使用AspUpload组件从硬盘上读任意两进制文件,并通过调用UploadManager的SendBinary方法,送往客户端:
<%
Set Upload = Server.CreateObject("Persits.Upload.1")
Upload.SendBinary "c:\dir\myfile.ext", True
%>
SendBinary方法内部使用Response.BinaryWrite. 如果第二个参数别设置为True或者忽略,这个方法将设置response.ContentType为一个合适的值(这个值来源于文件的后缀和注册表的设置)。如果文件后缀是未知的或者没有后缀,response.ContentType会被设置为"application/octet-stream"。如果第二个参数被设置为False,Response.ContentType会被设置为"application/octet-stream"。如果第二个参数被设置为false,Response.ContentType就需要你手工设置,SendBinary不会帮你设置。
ActiveX注册
UploadManager提供了一个方法RegisterServer,功能模仿Regsvr32那个程序。你可以使用它实现activex Dll上传自动注册。
<%
Set Upload = Server.CreateObject("Persits.Upload.1")
Upload.Save "c:\Upload"
For Each File in Upload.Files
Upload.RegisterServer File.Path
Next
%>
如果可选的第二个参数被设置为False,方法就不会注册这个库。
Upload.RegisterServer File.Path, False
在虚拟主机环境内禁止高级特性
当AspUpload在虚拟主机环境使用的时候,系统管理员可以选择禁止组件的一些特性(这些特性可能存在潜在的危险性,例如在任意目录保存文件,或者修改ACLs)。
这些特性可以禁止,修改系统注册表内的对应值。在Start/Run键入regedit,运行Registery Editor.
HKEY_LOCAL_MACHINE\SOFTWARE\Persits Software\AspUpload
缺省情况下所有注册表的值都被设置为0(有效),将他们设置为1(或任意非0值)就把相应的特性禁止掉了。
原标题:实用ASP组件介绍--文件上传组件
关键词:ASP