|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于ASP提供的是一对多的服务,所以用户的一些特殊需求很难得到满足。处理|上传|无组件 1、无组件上传的道理
我仍是一点一点用一个实例来讲明的吧,客户端HTML以下。要阅读上传附件,咱们经由过程<input type="file">元素,然而必定要注重必需设置form的enctype属性为"multipart/form-data":
<form method="post" action="upload.asp" enctype="multipart/form-data">
<label>
<input type="file" name="file1" />
</label>
<br />
<input type="text" name="filename" value="default filename"/>
<br />
<input type="submit" value="Submit"/>
<input type="reset" value="Reset"/>
</form>
在后台asp法式中,之前获得表单提交的ASCII 数据,十分的轻易。然而假如需求获得上传的文件,就必需利用Request对象的BinaryRead办法来读取。BinaryRead办法是对以后输出流停止指定字节数的二进制读取,有点需求注重的是,一旦利用BinaryRead 办法后,不再能利用Request.Form 或 Request.QueryString 纠合了。联合Request对象的TotalBytes属性,可以将一切表单提交的数据全体酿成二进制,不外这些数据都是经由编码的。起首让咱们来看看这些数据是若何编码的,有没有甚么纪律可循,编段代码,在代码中咱们将BinaryRead读取的二进制转化为文本,输入出来,在后台的upload.asp中(注重该示例不要上传大文件,不然能够会形成阅读器逝世失落):
<%
Dim biData, PostData
Size = Request.TotalBytes
biData = Request.BinaryRead(Size)
PostData = BinaryToString(biData,Size)
Response.Write "<pre>" & PostData & "</pre>" '利用pre,原样输入格局
' 借助RecordSet将二进制流转化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = CreateObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS.Open
RS.AddNew
RS("mBinary").AppendChunk(biData)
RS.Update
BinaryToString = RS("mBinary").Value
RS.Close
End Function
%>
复杂起见,上传一个最复杂的文本文件(G:\homepage.txt,内容为"宝玉:http://www.webuc.net";)来实验一下,文本框filename中保存默许值"default filename",提交看看输入了局:
-----------------------------7d429871607fe
Content-Disposition: form-data; name="file1"; filename="G:\homepage.txt"
Content-Type: text/plain
宝玉:http://www.webuc.net
-----------------------------7d429871607fe
Content-Disposition: form-data; name="filename"
default filename
-----------------------------7d429871607fe--
可以看出来关于表单中的项目,是用过"-----------------------------7d429871607fe"如许的界限来分隔成一块一块的,每块的入手下手都有一些描写信息,例如:Content-Disposition: form-data; name="filename",在描写信息中,经由过程name="filename"可以晓得表单项的name。假如有filename="G:\homepage.txt"如许的内容,申明是一个上传的文件,假如是一个上传的文件,那末枋鲂畔⒒岫嘁恍Content-Type: text/plain来描写文件的Content-Type。描写信息和主体信息之间是经由过程换行来分隔的。
嗯,根基上明晰了,依据这个纪律咱们就晓得该怎样来分别数据,再对分别的数据停止处置了,不外差点疏忽一个成绩,就是界限值(上例中的"-----------------------------7d429871607fe")是怎样晓得的?每次上传这个界限值是纷歧样的,还好还好asp中可以经由过程Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form-data; boundary=---------------------------7d429871607fe",有了这个,咱们不但可以判别客户真个form中有没有利用enctype="multipart/form-data"(假如没有利用,那末上面就没需要履行啦),还可以获得界限值boundary=---------------------------7d429871607fe。(注重:这里获得的界限值比下面的界限值开首要少"--",最好增补上。)
至于若何剖析数据的进程我就不多赘述了,不过就是借助InStr,Mid等如许的函数来分别出来咱们想要的数据。
2、分块上传,纪录进度
要及时反应进度条,本色就是要及时晓得以后办事器获得了几何数据?再回忆一下咱们完成上传的进程,咱们是经由过程Request.BinaryRead(Request.TotalBytes)来完成的,在Request的过程当中咱们没法得知以后办事器获得了几何数据。所以只能经由过程变通的办法了,假如咱们可以将获得的数据分红一块一块的,然后依据已上传的块数咱们就能够算出来以后上传了多大了!也就是说,假如我1K为1块,那末上传1MB的输出流就分红1024块来获得,例如我以后已获得了100块,那末就标明以后上传了100K。当我提出分块的时分良多人感觉难以想象,由于他们都疏忽BinaryRead办法不但是可以读取指定巨细,并且可以一连读取的。
写个例子来验证一下分块读取的完全性,在方才的例子基本上(注重该示例不要上传大文件,不然能够会形成阅读器逝世失落):
<%
Dim biData, PostData, TotalBytes, ChunkBytes
ChunkBytes = 1 * 1024 ' 分块巨细为1K
TotalBytes = Request.TotalBytes ' 总巨细
PostData = "" ' 转化为文本类型后的数据
ReadedBytes = 0 ' 初始化为0
' 分块读取
Do While ReadedBytes < TotalBytes
biData = Request.BinaryRead(ChunkBytes) ' 以后块
PostData = PostData & BinaryToString(biData,ChunkBytes) ' 将以后块转化为文本并拼接
ReadedBytes = ReadedBytes + ChunkBytes ' 纪录已读巨细
If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes
Loop
Response.Write "<pre>" & PostData & "</pre>" ' 利用pre,原样输入格局
' 将二进制流转化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = CreateObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS.Open
RS.AddNew
RS("mBinary").AppendChunk(biData)
RS.Update
BinaryToString = RS("mBinary").Value
RS.Close
End Function
%>
实验一下上传方才的文本文件,输入了局证实如许分块读取的内容是完全的,而且在While轮回中,咱们可以在每次轮回时将以后形态纪录到Application中,然后咱们就能够经由过程会见该Application静态获得</p> ASP由于使用了COM组件所以它会变的十分强大,但是这样的强大由于Windows NT系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失; |
|