asp上传文件代码详解
一、无组件上传的原理
我还是一点一点用一个实例来说明的吧,客户端
HTML如下。要浏览上传附件,
我们通过input type=file元素,但是一定要注意必须设置form的enctype
属性为multipartform-data:
form method=post action=upload.asp
enctype=multipartform-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方法来读取。Bin
aryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的
是,一旦使用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
%
简单起见,上传一个最简单的文本文件(Ghomepage.txt,内容为宝玉:htt
pwebuc.net)来试验一下,文本框filename中保留默认值default
filename,提交看看输出结果:
-----------------------------7d429871607fe
Content-Disposition form-data; name=file1;
filename=Ghomepage.txt
Content-Type textplain
宝玉:http
webuc.net
-----------------------------7d429871607fe
Content-Disposition form-data; name=filename
default filename
-----------------------------7d429871607fe--
可以看出来对于表单中的项目,是用过-----------------------------7d42
9871607fe这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息
,例如:Content-Disposition form-data; name=filename,在描述信息
中,通过name=filename可以知道表单项的name。如果有filename=Ghome
page.txt这样的内容,说明是一个上传的文件,如果是一个上传的文件,那
么描述信
息会多一行Content-Type textplain来描述文件的Content-Type。
描述信息和主体信息之间是通过换行来分隔的。
嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的
数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的----------
-------------------7d429871607fe)是怎么知道的?每次上传这个边界值是
不一样的,还好还好asp中可以通过Request.ServerVariables(
HTTP_CONTENT_TYPE)来获之,例如上例中HTTP_CONTENT_TYPE内容为:mult
ipartform-data; boundary=---------------------------7d429871607fe
,有了这个,我们不仅可以判断客户端的form中有无使用enctype=multipart
作者: 210.22.253. 2006-9-18 1634 回复此发言
--------------------------------------------------------------------------------
2 asp上传文件代码详