专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Asp教程 » 二进制上传:二进制上传文件的实现方法及代码 »正文

二进制上传:二进制上传文件的实现方法及代码

来源: 发布时间:星期四, 2008年9月25日 浏览:56次 评论:0
<Formaction=\"upload.asp\"method=postenctype=\"multipart/form-data\">
上传文件:<Inputtype=filename=file1><br>
<inputtype=submitname=uploadvalue=\"上传\">
</form>

其中,enctype参数用来设置表单的MIME编码方式,在进行文件(或同时包含文本框)上传时,必须将其属性设置为\"multipart/form-data\";upload.asp是服务器端对接收到的二进制文件流进行处理的ASP程序,在本文的后面将陆续介绍其内容。

2、上传文件格式分析

在处理文件之前,我们要先了解上传的文件的具体格式,通过编写下面一段简单的ASP程序就可以查看其二进制代码:

<%
filesize=Request.TotalBytes’获得上传文件的大小
filedata=Request.BinaryRead(filesize)’获得上传文件的二进制数据
Response.BinaryWritefiledata’在浏览器上显示二进制数据
%>

分析浏览器上显示的上传文件的二进制代码,发现代码包括四个部分(若同时上传多个文件或文本框,则代码按上传的先后次序排列,格式相同),每一部分的内容是用回车换行符号来进行分隔的:

1)第一部分(起始标志)
-----------------------------7d329631b04d4
2)第二部分(文件说明)

Content-Disposition:form-data;name=\"file1\";filename=\"C:\\DocumentsandSettings\\Administrator\\MyDocuments\\Invitation.doc\"Content-Type:application/msword


在此,我们可以获得上传文件的文件名称及绝对路径,也可以获得文件类型。这些信息是正确保存文件所不可缺少的。

3)第三部分(文件内容)

即文件的二进制内容,略。

4)第四部分(结束标志)

-----------------------------7d329631b04d4

结合第一部分和第四部分的内容来看,\"-----------------------------7d329631b04d4\"(每次上传,数值都不一样)起到了分割符的作用,它标志着一段数据(当有多个上传内容时)的开始和结束。从保存文件所需要的信息来讲,我们首先需要从第二部分数据的\"filename\"中获得文件名称,然后需要正确定位文件的起始位置,最后利用ASP技术将二进制文件用本来的文件名保存即可。若同时上传多个内容(如多个文本框和文件),也是按同样的方法处理,每部分的内容都包含在分割符之中,只是文本框和文件的表现形式稍有不同,这可以通过具体分析其二进制代码来了解。

3、利用ASP技术实现文件存储

上传文件代码的处理

1)获得分割符代码

从上面的分析我们已经知道,分割符起到了分割多个数据段(包括文本框和各种类型的文件)的重要作用。前面已经分析过,分割符出现在第一个回车换行符号前。因此,通过下面这段程序就可获得分割符代码:

<%
newline=chrB(13)&chrB(10)’newline表示二进制的回车符 [Page]
filesize=Request.TotalBytes’filesize是上传文件的大小
filedata=Request.BinaryRead(filesize)’filedata是上传文件的二进制数据
divider=leftB(filedata,clng(instrb(filedata,newline))-1)’divider是分割符
%>

注:因为这里处理的都是二进制字节码,因此,所有的函数都是使用它的二进制版本,加了\"b\"。

2)获得文件(或文本框)内容

(1)预备函数(将二进制串转化成字符串)

上传文件的内容不需要经过二进制向字符串的转换过程,直接保存就可。但是,若需提取文本框内容或文件的名称,就必须进行转换。因此,需要编写一个通用的,并且适用于汉字的转换函数。以下是该函数代码:

FunctionBtoS(bstr)
IfnotIsNull(bstr)Then
fori=0tolenb(bstr)-1
bchr=midb(bstr,i+1,1)
Ifascb(bchr)>127Then’汉字是双字节,得两个字符一起处理
temp=temp&chr(ascw(midb(bstr,i+2,1)&bchr))
i=i+1
Else
temp=temp&chr(ascb(bchr))
EndIf
next
EndIf
BtoS=temp
EndFunction

(2)获得文件(或文本框)内容

在实际的WEB应用中,上传操作可能涉及多项内容,如多个文本框、多个文件等等。文件和文本框很好区分,文件的数据中包含了\"filename=\"字串。因此,我们写了如下的通用函数,既可用于提取文件内容,又可提取文本框内容(需进行二进制转换):

Functiongetdata(byvaldata,byvaldivider,final)’data表示二进制串;divider表示分割符;final表示数据的结束位置
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34)’字符串filename=\"的二进制表示
bncrlf=chrb(13)&chrb(10)’二进制的回车符
startpos=instrb(data,divider)+lenb(divider)+lenb(bncrlf)’开始位置

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: