二进制上传:二进制上传文件的实现方法及代码来源: 发布时间:星期四, 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
相关文章读者评论
发表评论 |