首页  新闻动态  文化知识  网络文摘  生活时尚  娱乐休闲  健康频道  外语学习  软件教学  程序设计  独山图片  书店网站 
  程序设计 > Asp/Vbscript > 正文
 

ASPUpLoad组件使用方法大全

来源:独山在线 [2008-07-17]   浏览次数:7713
ASPUpLoad 文件上传

我们来创建一个简单的能上传3个文件的HTML form,和控制上传的脚本。
这里是第一个HTML文件
Test1.htm:
<HTML>
<BODY BGCOLOR="#FFFFFF">

<FORM. METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript1.asp">
<INPUT TYPE=FILE SIZE=60 NAME="FILE1"><BR>
<INPUT TYPE=FILE SIZE=60 NAME="FILE2"><BR>
<INPUT TYPE=FILE SIZE=60 NAME="FILE3"><BR>
<INPUT TYPE=SUBMIT VALUE="Upload!">
</FORM>
</BODY>
</HTML>
    每个 <INPUT TYPE=FILE> 项在浏览器中显示成为一个带有"Browse..."按钮的文本输入框。如果你没看见Browse按钮,很有可能说明你的浏览器不支持文件上传。

    这里是相应的上传脚本 UploadScript1.asp:
   <HTML>  
<BODY>  
<%  
Set Upload = Server.CreateObject("Persits.Upload.1")  
Count = Upload.Save("c:\upload")
%>
<% = Count %> files uploaded.  
</BODY>  
</HTML>




ASP脚本的第一行仅仅创建了一个AspUpload对象的实例。第二行调用组件的Save方法,它实际上的作用是:它解析从浏览器发送的东西,计算出有多少个文件正在上传,并且把他们存在服务器上指定的目录。目录名可能以反斜线结束,也可能不是。所有文件将以他们原来的名字存放在目录中。我们很快将看到如何更改任意或者所有文件的名字。

Save方法返回成功上传的文件数量。万一发生错误,这个方法将抛弃之。

注意你能够使用我们的form中任意或者全部三个输入框。AspUpload有足够的智慧判断出哪些输入框使用了,哪些没有。
  

使用FILES和FORMS集合访问单个form项
我们看看第二组示例:

Test2.htm
<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=TEXT NAME="DESCR1"><BR>
File 2:<INPUT TYPE=FILE NAME="FILE2">
Description 2:<INPUT TYPE=TEXT NAME="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>  
Other items:<BR>  
<%  
For Each Item in Upload.Form  
Response.Write Item.Name & "=" & Item.Value & "<BR>"
Next
%>  
</BODY>  
</HTML>



注意我们的HTML form现在有两种输入框,TYPE=FILE 和 TYPE=TEXT。因为我们form的ENCTYPE属性,我们不再能通过标准的ASP Response.Form. 集合来访问form变量。此处Upload.Form. 来解决了问题。这个集合实际上和Response.Form一样,也就是,我们能通过整形或字串型索引访问它的元素。例如:

Set Item1 = Upload.Form("DESCR1")

或者

Set Item1 = Upload.Form(1).

我们也能够使用上面示例代码显示的For-Each语句遍历集合中的项。Form集合包含FormItem类型的对象,它只有两个字串属性,Name 和 Value (缺省属性).

记住Upload.Form集合仅仅包含非文件项,也就是不同于<INPUT TYPE=FILE>,这点很重要。AspUpload提供另外一个集合,叫做Files,来包含UploadedFile类型的对象,这种对象代表已经上传的来自<INPUT TYPE=FILE>项的文件。很象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

注意我们已经通过UploadedFile对象相应的Path和Size属性获得了上传过的文件的目标路径和文件大小。

如果我们的form只包含一个文件输入框,<INPUT TYPE=FILE NAME="ONLYFILE">,那么没有必要使用For-Each语句。我们只需要这么说

Response.Write Upload.Files("ONLYFILE").Path

或者,更常用的

Response.Write Upload.Files(1).Path


   要点:Files和Form集合在调用Save方法前都不会装入,因此在调用Upload.Save前就查询这些集合是不正确的。

'' 错误!
Upload.Save( Upload.Form("Path") )
限制文件大小
也许你需要限制上传文件的大小,以防止服务器磁盘空间拥塞。你所需要做的一切就是在调用Save之前在你的Upload对象中调用SetMaxSize:
Set Upload = Server.CreateObject("Persits.Upload.1")
Upload.SetMaxSize 50000, False
Upload.Save "c:\upload"

   在这个例子中,我们将上传文件的大小限制在50000字节内。第二个可选参数指定超出文件最大范围的部分是否应该被删除(如果设成false或者不设),或者作为错误例外拒绝接收(如果设成True) 。

  

强制特有文件名
    缺省的,AspUpload将覆盖上传路径中已有的文件。如果你不想这样,可以配置组件,为上传文件产生特有的名字来防止覆盖已有文件。方法是,在调用Save前设置上传管理器的OverwriteFiles属性:

Upload.OverwriteFiles = False

缺省值是true。

   为防止名字冲突,AspUpload将在原来文件名后面加上用圆括号括起来的整数。例如,如果文件MyFile.txt已经存在于上传目录了,并且另外一个同名文件正在上传,AspUpload会将新文件存为 MyFile(1).txt。如果我们上传更多的MyFile.txt,他们将被存MyFile(2).txt, MyFile(3).txt,等等。
  

移动、拷贝、删除文件
文件上传对象提供了一些方法供你移动、拷贝或者删除上传的文件。这些方法是
file.Move( NewName As String )
file.Copy( NewLocation As String, Optional Overwrite)
file.Delete

   根据NewName参数,Move方法将文件移动到其他目录或者给他更名。假设文件abc.txt上传到了目录
c:\Upload。那么调用

file.Move "c:\WINNT\abc.txt" 将把文件移动到 c:\WINNT, 而调用
file.Move "c:\Upload\xyz.txt" 只会更改文件名。

要知道Move方法有个副作用是很重要的:当这个方法成功调用后,这个文件对象的Path属性将指向新目录/名字。

Copy属性把文件拷贝到新目录/名字。新目录必须是完全合法的路径。 Overwrite参数如果设成True或者不设,就会指示Copy方法覆盖新目录里的已有文件。 如果设成False,当文件在新目录中已经存在地时候,会导致方法失败。与Move方法不同,这个方法不会影响Path属性。

有时你可能选择使用Delete方法,例如你在把文件作为BLOBs存入数据库中,并且不再需要它放在你的上传路径里时。将文件存入数据库是我们下一个要讨论的主题。

  

把文件作为BLOBs存入数据库
   许多数据库管理系统象Ms Access或者SQL Server将允许你将任意文件存为"binary large objects"(BLOBs)。一个MS Access表格能够在OLE Object型的数据字段中存放二进制文件。在SQL Server中,相应的数据类型是IMAGE。存放的文件以后能够重新取出供下载,或者用ADO显示。
AspUpload让你只使用短短一行代码就能把上传文件存入数据库!让我们看看第三组示例文件。文件 Test3.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当以外发生时,不要显示错误信息,只将意外代码和描述存放到内建的Err对象,并且继续脚本的执行。

下一行

File.ToDatabase "DSN=data;UID=sa;PWD=xxx;", "insert into Blobs(id, Path, BigBlob) values(12, ''" & File.Path & "'', ?)"

是将文件存放入数据库所采用的一切。我们来检查一下这个方法的两个参数:

第一个参数是下列格式的ODBC连接字串:

"DSN=datasource;UID=userid;PWD=password;<other optional parameters>"

第二个参数是SQL INSERT或者UPDATE语句,带有一个问号(?),并且只能带一个。它的作用是为要存储的文件提供空间容器。在这个例子中,我们下部的数据库表Blobs包含三栏:一个Integer ID,一个VARCHAR Path,和一个IMAGE BigBlob。这个SQL INSERT语句将12放入ID栏,文件路径放入Path栏,真实文件放入BigBlob栏。

下一行检查语句在成功执行前是否正确。如果成功,Err对象取值0并且删除文件
(File.Delete行),因为文件已经存入数据库,不需要再放在上传路径中了。否则,Err包含一个数字错误代码,并且Err.Description包含对于意外的语言描述。


将GIF和JPEG图象存入数据库很常见。将图象从数据库中取出并显示在HTML页中,你不需要使用任何第三方组件。ADO就能完成任务。

在你的HTML页面中放入普通<IMG>标签,将SRC属性指向一个ASP脚本,例如

<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")
%>


===========================================



使用AspUpload组件上传文件,使用范例代码如下:
AspUpload组件上传测试
<form method="POST" enctype="multipart/form-data" action="?act=upload">
<input type="file" size="40" name="file1"><br>
<!--<input type="file" size="40" name="file2"><br>
<input type="file" size="40" name="file3"><br>-->
<br>其他表单项<input type="text" name="uploadText" value=""><br>
<br><input type="submit" value="上传文件">
</form>
<%
if request("act") = "upload" then

AllowExt = "jpg,png,gif,zip,rar,sql,txt,bak"
On Error Resume Next

' 新建AspUpload对象
Set Upload = Server.CreateObject("Persits.Upload")

' 限制文件大小
Upload.SetMaxSize 4194304, True

' 上传路径--当前目录下的test目录
uploadDir = Server.MapPath("test")

' 尝试创建路径文件夹,true表示忽略目录已存在错误
Upload.CreateDirectory uploadDir, true

' 先上传文件至服务器内存
Count = Upload.Save()

' 检测上传错误
If Err.Number = 8 Then
Response.Write chinese2unicode("错误: 文件过大!")
Response.end
Else
If Err <> 0 Then
response.write chinese2unicode("发生错误:")
response.write chinese2unicode(Err.Description)
response.end
End If
End If

'Response.Write chinese2unicode("共 " & Count & " 个文件") & "<br><br>"

' 指定一个上传的表单文件
Set File = Upload.Files("file1")
If Not File Is Nothing Then
' 获取原本文件名
Filename = File.Filename
' 获取文件扩展名
Fileext = File.Ext

' 检测文件格式是否合格
ChkStr = ","&Lcase(AllowExt)&","
If Instr(ChkStr,","&right(Fileext,3)&",") <= 0 Then
Response.Write chinese2unicode("错误: 文件类型不正确!")
response.write "<br>"
response.write chinese2unicode("只允许:"&AllowExt)
' 删除内存中的临时文件,以释放内存或硬盘空间(还可用Copy、Move两个指令)
File.Delete
' 检测是否存在文件
elseif Upload.FileExists(uploadDir & "\" & Filename) Then
File.SaveAs uploadDir & "\" & Filename
Response.Write chinese2unicode("已覆盖存在相同文件名的文件: ") & File.Path
' 保存文件
else
File.SaveAs uploadDir & "\" & Filename
Response.Write chinese2unicode("文件已保存到: ") & File.Path
end If
Else
Response.Write chinese2unicode("错误: 您并没有选择文件!")
End If

Response.Write "<br><br>"

'' 批量上传文件,去掉注释即可用。
For Each File in Upload.Files
'File.SaveAs uploadDir & "\" & File.FileName
'Response.Write chinese2unicode("文件已保存到: ") & File.Path & "<br>"
Next


'Response.Write "<br><br>Files:<br>"
For Each File in Upload.Files
'Response.Write File.Name & "= " & File.Path & " (" & File.Size &" bytes)<br>"
Next

'' 列出其他表单内容(必须执行Upload.Save()后才有效)
For Each Item in Upload.Form
Response.Write Item.Name & " = " & Item.Value & "<br>"
Next

'列出指定的表单内容
Response.Write "<br>"&chinese2unicode("列出指定内容uploadText:"&Upload.Form

("uploadText").value)



end if



' gb2312转unicode,解决中文乱码问题
function chinese2unicode(Str)
dim i
dim Str_one
dim Str_unicode
for i=1 to len(Str)
Str_one=Mid(Str,i,1)
Str_unicode=Str_unicode&chr(38)
Str_unicode=Str_unicode&chr(35)
Str_unicode=Str_unicode&chr(120)
Str_unicode=Str_unicode& Hex(ascw(Str_one))
Str_unicode=Str_unicode&chr(59)
next
Response.Write Str_unicode
end function
%>


=================================================


我常用到的一些ASPUPLOAD组件的操作

1、Err.Number为8时表示:文件大小超过MaxSize。

2、读取表单内容时可直接使用obj.Form("item")来读取。

3、读取上传文件时 需要Set file1=obj.Files("file1"),然后针对file1来读取各属性的值。

4、相对文件的各属性值如下:
    FileName   文件名(无路径)
    Ext   文件扩展名(有大小写)
    Path   完整的文件绝对路径
    Folder   上传到主机上的绝对路径(后面有/)
    Size   文件大小(Byte)
    ImageType   图片类型(BMP GIF JPG JPEG PNG可以自动辨别)
    ImageWidth   图片高度
    ImageHeight   图片的高度

5、AspUpload上传的判断代码:

Set oUpload = Server.CreateObject("Persits.Upload")   '创建一个Object
On Error Resume Next   '用于读出错误代码
oUpload.SetMaxSize 1048576, True   '设置一个文件最大值
UpCount = oUpload.Save(Server.MapPath("./"))   '上传文件并返回文件的数量
'判断文件大小是否超过限制
If Err.Number = 8 Then
   Response.Write "文件超过指定大小"
   Set oUpload = Nothing
   Response.End
End If
'判断文件是否上传
If UpCount = 0 Then
   Response.Write "没有选择要上传的文件"
   Set oUpload = Nothing
   Response.End
End If
'指定文件的连接
Set file1=oUpload.Files("file1")
'把上传的文件拷贝到temp文件夹下并改名为temp.jpg
file1.Copy Server.MapPath("temp/temp.jpg")
'把上传的文件移动到temp2文件夹下并改名为temp2.jpg
file1.Move Server.MapPath("temp2/temp2.jpg")
'删除文件


==================================================

AspUpload组件的属性中文说明


UploadManager 属性
=============================================
CodePage As Long (Read/Write)
可以把表单的文本项目名和文件名的字符从指定的CodePage转换为Unicode,比如表单是按UTF-8提交的,那么这个属性应该设置为65001。其他的如1251 (Cyrillic), 1255 (Hebrew), 1256 (Arabic)等等。

用法:
Upload.CodePage = 65001
-------------------------------------------
DetectMacBinary As Boolean (Read/Write)
默认为True。 这个属性用来控制是否检测上传的文件是MacBinary格式的,如果是则从中提取“data fork”。AspUpload 3.0 Beta 1. 不支持。

用法:
Upload.DetectMacBinary = False
--------------------------------------------
Directory (Path As String, Optional SortBy, Optional Ascending) As Object (Read-Only)
返回一个集合,这个集合包括指定目录的所有子目录和文件的引用。
在这个集合里,子目录总是优先于文件.Path 可以包括通配符 * 和 ?。

SortBy 可以是: SORTBY_NAME (1, default). SORTBY_TYPE (2), SORTBY_SIZE (3), SORTBY_CREATIONTIME (4), SORTBY_LASTWRITETIME (5), and SORTBY_LASTACCESSTIME (6).

Ascending 默认为True。

用法:

<!--METADATA TYPE="TypeLib" UUID="{B4E1B2DE-151B-11D2-926A-006008123235}"-->
Set Dir = Upload.Directory("c:\path\*.*", SORTBY_SIZE)
For Each Item in Dir
...
Next
-------------------------------------------
Expires As Date (Read-Only)
如果已经注册,返回9/9/9999,否则返回失效期。

用法:
Response.Write Upload.Expires
-------------------------------------------
Files As Object (Read-Only)
返回一个集合,这个集合包含有上传文件的引用。

使用这个集合之前,必须调用Save或 SaveVirtual方法。

要引用一个单个文件,可以使用从1开始的整数下标,或者相应的文件框的名称。

要列举集合里的项目,可以使用For/Each 语句。

用法:

Set File = Upload.Files(1)

Set File = Upload.Files("FILE1")

For Each File in Upload.Files
...
Next
-------------------------------------------
Form As Object (Read-Only)
返回一个集合,这个集合包括所有不是文件框的表单项目的引用。

使用这个集合之前,必须调用Save或 SaveVirtual方法。

要引用一个单个表单项目,可以使用从1开始的整数下标,或者相应的项目的名称。

要列举集合里的项目,可以使用For/Each 语句。

用法:

Name = Upload.Form(1)

Name = Upload.Form("Name")

For Each Item in Upload.Form
Response.Write Item.Value
Next
-------------------------------------------
IgnoreNoPost As Boolean (Read/Write)
当Upload.Save方法被脚本直接调用,而不是通过表单提交时,可以避免 "Wrong Content-Type"这个错误。当表单和相应的上传脚本在同一个文件时,这个属性很有用。

用法:

Upload.IgnoreNoPost = True
-------------------------------------------
OverwriteFiles As Boolean (Read/Write)
默认为True。如果设置为False,那么当文件名已经存在时,AspUpload会在原文件名后附加“(12)”这种形式的字符。这个属性影响Save, SaveVirtual 和 File.SaveAs方法。
用法:

Upload.OverwriteFiles = False
-------------------------------------------
PreserveFileTime As Boolean (Read/Write)
默认为Flase。如果设置为True,会试图保护上传文件的上次修改时间。
这个属性只是客户端使用XUpload或者JUpload 的时候有用。
当使用常规Form提交的时候,它没有任何作用。
用法:

Upload.PreserveFileTime = False
-------------------------------------------
ProgressID As String (Read/Write)
上传进度条所用的,用来区分上传进程。

用法:

Upload.ProgressID = Request.QueryString("PID")
-------------------------------------------
RegKey As String (Read/Write)
指定注册码,如果没有指定,AspUpload会从系统注册表读取。
用法:

Upload.RegKey = "12345-67890-12345"
-------------------------------------------
TotalBytes As Long (Read-Only)
返回上传的总字节数。
只能在成功调用Save(SaveVirtual)方法后调用这个属性。

用法:
Response.Write Upload.TotalBytes
-------------------------------------------
TotalSeconds As Long (Read-Only)
返回上传持续的总时间。
只能在成功调用Save(SaveVirtual)方法后调用这个属性。

用法:
Response.Write Upload.TotalSeconds
-------------------------------------------
Version As String (Read-Only)
返回组件的版数,如:"3.0.0.0".
用法:

Response.Write Upload.Version
-------------------------------------------
>>上篇:已经没有了
>>下篇:已经没有了
 
 
版权所有:独山在线 copyright ©2007-2024 www.dushan.net, All Rights Reserved.
   免责声明:本网转载或链接出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。
   本站为公益性网站,旨在宣传独山,如有侵犯请和我们联系,经查实将及时删除! 工信部备案:黔ICP备07001263号-3