仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1144|回复: 18
打印 上一主题 下一主题

[学习教程] ASP网页编程之用两行代码在阅读器中完成文件上传

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:28:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
缺乏可以共同遵循的行业标准,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就不用说了,
再现理想 该用户已被删除
沙发
发表于 2015-2-5 12:11:25 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题:
小妖女 该用户已被删除
板凳
发表于 2015-2-11 19:08:30 | 只看该作者
我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标.
活着的死人 该用户已被删除
地板
发表于 2015-2-20 00:47:57 | 只看该作者
Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名")
若相依 该用户已被删除
5#
发表于 2015-3-3 01:00:09 | 只看该作者
Session:这个存储跟客户端会话过程的数据,默认20分钟失效
小魔女 该用户已被删除
6#
发表于 2015-3-6 05:59:47 | 只看该作者
如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-7 01:14:40 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题:
冷月葬花魂 该用户已被删除
8#
发表于 2015-3-13 23:43:57 | 只看该作者
下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助...
蒙在股里 该用户已被删除
9#
发表于 2015-3-19 18:02:44 | 只看该作者
如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。
再见西城 该用户已被删除
10#
发表于 2015-3-27 19:08:38 | 只看该作者
运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。
第二个灵魂 该用户已被删除
11#
发表于 2015-3-29 03:18:51 | 只看该作者
兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的
兰色精灵 该用户已被删除
12#
发表于 2015-4-8 09:08:29 | 只看该作者
Response:从字面上讲是“响应”,因此这个是服务端向客户端发送东西的,例如Response.Write
柔情似水 该用户已被删除
13#
发表于 2015-4-15 23:00:22 | 只看该作者
Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名")
爱飞 该用户已被删除
14#
发表于 2015-4-20 01:24:42 | 只看该作者
用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
15#
发表于 2015-4-21 19:39:24 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
谁可相欹 该用户已被删除
16#
发表于 2015-4-26 20:09:41 | 只看该作者
虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。
海妖 该用户已被删除
17#
发表于 2015-5-3 05:56:42 | 只看该作者
学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:
飘飘悠悠 该用户已被删除
18#
发表于 2015-5-12 00:57:44 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
不帅 该用户已被删除
19#
发表于 2015-6-11 02:38:55 | 只看该作者
我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-27 23:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表