文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页技术开发ASP技巧 → 用两行代码在浏览器中实现文件上传

用两行代码在浏览器中实现文件上传

时间:2004/11/7 4:10:00来源:本站整理作者:蓝点我要评论(0)

简介

文件上传是将任意的文件从客户机发送到服务器的过程。最简单、最方便的上传方法是使用支持RFC1867的浏览器,如微软的Internet Explorer4.0以上版本,Netscape3.0以上版本,或者带附件的Internet Explorer3.0。基于浏览器的文件上传是通过带有属性ENCTYPE="multipart/form-data"的HTML form实现的。这个form也必须包含一个或多个项,以让用户指定要上传的本地文件。





带有ENCTYPE="multipart/form-data"属性的form所发送的数据必须被一个服务器端过程解析,以展开上传的文件和其他非文件项。在ASP环境中,这种任务用编译好的active server组件能最好的完成,比如Persits软件公司的AspUpload

(http://www.persits.com)。



本文所有示例都是建立在你的系统中安装了AspUpload的基础上的。可以在这里下AspUpload

免费评估版http://www.persits.com/aspupload.html。解压文件后,将AspUpload.dll

放在任意目录中,在MS DOS窗口中执行命令



regsvr32 c:\dir\AspUpload.dll

开始

我们来创建一个简单的能上传3个文件的HTML form,和控制上传的脚本。

这里是第一个HTML文件

Test1.htm:


























每个 项在浏览器中显示成为一个带有"Browse..."按钮的文本输入框。如果你没看见Browse按钮,很有可能说明你的浏览器不支持文件上传。



这里是相应的上传脚本 UploadScript1.asp:

    

  

<%  

Set Upload = Server.CreateObject("Persits.Upload.1")  

Count = Upload.Save("c:\upload")

%>

<% = Count %> files uploaded.  

  











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



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



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

  



使用FILES和FORMS集合访问单个form项

我们看看第二组示例:



Test2.htm









File 1:

Description 1:


File 2:

Description 2:














  

UploadScript2.asp   

  

<%  

Set Upload = Server.CreateObject("Persits.Upload.1")  

Upload.Save "c:\upload"

%>  

Files:
  

<%  

For Each File in Upload.Files  

Response.Write File.Name & "=" & File.Path & " (" & File.Size & ")
"

Next

%>  

  

Other items:
  

<%  

For Each Item in Upload.Form  

Response.Write Item.Name & "=" & Item.Value & "
"

Next

%>  

  









注意我们的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集合仅仅包含非文件项,也就是不同于,这点很重要。AspUpload提供另外一个集合,叫做Files,来包含UploadedFile类型的对象,这种对象代表已经上传的来自项的文件。很象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只包含一个文件输入框,,那么没有必要使用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 很值得我们注意:

  

    

  

<%  

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

%>  

  









这一行



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



第二个参数是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页面中放入普通标签,将SRC属性指向一个ASP脚本,例如







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文档,并下载免费评估版本,请访问Persists软件公司的web站点

http://www.persits.com/aspupload.html。这个组件的注册费用是$99.00(单CPU协议)。

常问到的问题

问:  AspUpload能在所有ASP版本上工作吗?

答:  不.早期版本ASP的Request对象不提供BinaryRead或者TotalBytes方法,而本组件对这两个方法依赖很大。检验你的ASP版本是否允许上传的最好方法是执行象<% n = Request.TotalBytes %>这样一句简单的脚本,看你的ASP模块能否识别。



问:  哪里能获得最新版本的ASP?

答:这取决于你的web服务器的版本。如果你使用PWS或者IIS3.0,你可以到

http://www.microsoft.com/office/intranet/modules/asp411s3.asp下载最新版本。如果你使用IIS4.0你可以从http://www.microsoft.com/iis下载并安装Option Pack 4。



问: 微软Internet Explorer 3.0支持文件上传吗?

答:  缺省的,是不支持。但是有一个IE3的附件可以用,从此下载 http://www.microsoft.com/msdownload/iebuild/ie3add_win32/en/ie3add_win32.htm.

  



关于作者

Peter Persits (peter@persits.com)是Persits Software, Inc的创建者和总裁,流行ASP组件 AspNTUser, AspGrid, AspAccessControl, AspUpload 和 AspEmail的作者。Peter已经从事软件开发10多年。他拥有American University (Washington, DC)的计算机科学硕士学位,并且是微软认证解决方案开发员。他现住在Arlington, VA。


相关阅读 Mac访问Windows共享文件夹Windows 7正版系统验证方法windows 8.1系统版本号查看方法Windows 8.1系统电话激活时无法输入微软返回代码解决方法Windows 8如何调整屏幕分辨率windows8.1磁盘占用100%解决方法Mac双系统如何删除Boot Camp安装的Windows分区Apple教你如何在Mac 上运行 Windows

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 VB.NET 2005编写定时关 Jquery get/post下乱码解决方法 前台gbk gb如何使用数据绑定控件显示数据ASP脚本循环语句ASP怎么提速

人气排行 轻松解决"Server Application Error"和iis"一起学习DataGridView调整列宽用ASP随机生成文件名的函数Jquery get/post下乱码解决方法 前台gbk gbODBC Drivers错误80004005的解决办法返回UPDATE SQL语句所影响的行数的方法用Javascript隐藏超级链接的真实地址两个不同数据库表的分页显示解决方案