ASP网页编程之用两行代码在阅读器中完成文件上传
缺乏可以共同遵循的行业标准,ASP还处在发展初期,大家对它的理解不同,如产品和服务标准,收费标准等,不利于行业的健康发展。 简介文件上传是将恣意的文件从客户机发送到办事器的进程。最复杂、最便利的上传办法是利用撑持RFC1867的阅读器,如微软的Internet Explorer4.0以上版本,Netscape3.0以上版本,或带附件的Internet Explorer3.0。基于阅读器的文件上传是经由过程带有属性ENCTYPE="multipart/form-data"的HTML form完成的。这个form也必需包括一个或多个<INPUT TYPE=FILE>项,以让用户指定要上传的当地文件。
带有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:
<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文档,并下载收费评价版本,请会见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。
对于中小型web应用来说,php有很强的竞争力,linux+apache+mysql+php(lamp)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,jsp的struts是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来。asp就不用说了, ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名") Session:这个存储跟客户端会话过程的数据,默认20分钟失效 如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助... 如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。 运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。 兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的 Response:从字面上讲是“响应”,因此这个是服务端向客户端发送东西的,例如Response.Write Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名") 用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。 学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点: 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。
页:
[1]