统计在线人数...

ASP文件上传神功 第三重:集成类、多语种通用,使用方便

[ 来源:ASP教程 | 作者:Admin | 时间:2004-10-12 上午 01:18:23 | 浏览:统计中... ]


这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友(比我还菜的:-))有所帮助。

请诸位大虾能对其中的不正或不良这处予以指正。

程序中stream对象的用法上参考了“化境HTTP上传程序 Version 2.0”在代码,在此对稻香老农和梁无惧表示衷心的感谢和由衷的敬意。

先来分析一下,为后面的数据分析算法打点基础,以下是我摘录的一小段网页中提交的二进制数据:
-----------------------------7d31ec15102d0
Content-Disposition: form-data; name="txtTitle"

满脑的想法
-----------------------------7d31ec15102d0
Content-Disposition: form-data; name="filImage"; filename="F:\material\木纹背景\pic016.jpg"
Content-Type: image/pjpeg

? JFIF    C

!!E.'.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE?"    
?  } !1AQa"q2亼?#B绷R佯$3br?
侼s歊J佦=ǜ珻,%??Xm 銓鼽?幮??驲湕胄滙C?
儗 g?咶? tS?B矠:u隠c
g不t凄L琰h`啨0p
g殲41?9'$筵奆]眬?膁?摍? 渦"??
-----------------------------7d31ec15102d0
Content-Disposition: form-data; name="btnUpload"

Upload
-----------------------------7d31ec15102d0--

蓝色的字符的内容我们应该熟悉吧,中间的乱码就是洗奈募哪谌荩涫滴颐且龅木褪墙庖欢咽萁蟹治觯舫龆晕颐怯杏玫氖荼4嫦吕淳蚈K了。分析数据就是查找一些标志性的内容,如回车换行符,“----------”符号,用两个指针确定两个位置,然后提取数据,我的算法不知道好不好,本人的数据结构是学得很烂的,十分sorry。

以下是一个完事的应用,其中的类定义可以与入另一个文件,使用的时候只要用

<!--include file="LjUpload.cls"-->

命令包含进来就可以了。

LjUpload.asp:

<%@ Language=VBScript %>
<% option explicit %>

<script language=vbscript runat=server>

private srmRequestData'adodb.stream对象,保存从form中提交来的所有数据

private adTypeBinary'adodb.stream对象的叁数:返回二进制数据
private adTypeText'adodb.stream对象的叁数:返回文本数据
private adModeRead'adodb.stream对象的叁数:对象可读
private adModeWrite'adodb.stream对象的叁数:对象可写
private adModeReadWrite'adodb.stream对象的叁数:对象可读写

class LjUpload'定义桓隼啵莆狶jUpload。

private bytCrLf'单字节的回车换行符,共2字节
private bytSub'单字节的“-”符号,共8字节
private binData'二进制数据变量,保存一个提交数据的复本,便於操作

private dicForm'保存form文本域的信息
private dicFile'保存form文件域的信息
private strName'form表单的输入域名称
private strValue'form表单的输入域值
private objFile'文件信息对象,保存文件相关的信息,具体叁看class LjFile的定义

private posB'二进制数据读写指针,开始指针
private posE'二进制数据读写指针,结束指针
public Charset'语言属性设置

private sub Class_Initialize'类初始化过程

bytCrLf = getSBfromDB(vbcrlf)
bytSub = getSBfromDB("--------")
Charset = "gb2312"'默认语言属性设置为简体中文:gb2312

adTypeBinary = 1'返回二进制数据
adTypeText = 2'返回文本数据
adModeRead = 1'对象数据可读
adModeWrite = 2'对象数据可写
adModeReadWrite = 3'对象数据可读写
end sub

public sub GetData'类的打开过程,上传文件及分析数据的过程

set srmRequestData = server.CreateObject("adodb.stream")'建立一个adodb.stream对象

srmRequestData.Type = adTypeBinary'指定返回数据类型
srmRequestData.Mode = adModeReadWrite'指定打开模式
srmRequestData.Open'打开对象
srmRequestData.Write request.BinaryRead(request.TotalBytes)'获取所有form提交的数据

srmRequestData.Position = 0'读写指针重新定位至对象头部,写数据,指针已指向对象尾
binData = srmRequestData.Read'在变量中保存提交数据的复本,便於操作

set dicForm = server.CreateObject("scripting.dictionary") '用来保存文本信息
set dicFile = server.CreateObject("scripting.dictionary") '用来保存文件信息

posB = instrb(binData,bytSub)'开始分析所获取的二进制数据
posB = instrb(posB,binData,bytCrLf) + 2 '+2是加入回车换行符本身的长度
posB = instrb(posB,binData,getSBfromDB("name=""")) + 6
do until posB = 6'控制条件的设置有多种方式,这里的仅供叁考
posE = instrb(posB,binData,getSBfromDB(""""))
strName = getTextfromBin(srmRequestData,posB,posE-posB)

posB = posE + 1 '指针移动到“"”的後面
posE = instrb(posB,binData,bytCrLf)

if instrb(midb(binData,posB,posE-posB),getSBfromDB("filename=""")) > 0 then '这是一个file域
posB = instrb(posB,binData,getSBfromDB("filename=""")) + 10
posE = instrb(posB,binData,getSBfromDB(""""))
set objFile = new LjFile'建立一个文件信息对象
if posE>posB then
objFile.FileName = getFileNamefromPath(getTextfromBin(srmRequestData,posB,posE-posB))'写入文件名称
posB = instrb(posB,binData,getSBfromDb("Content-Type:")) + 14
posE = instrb(posB,binData,bytCrLf)
objFile.ContentType = getTextfromBin(srmRequestData,posB,posE-posB)'写入文件类型
posB = posE + 4'这个地方换了两行,具体叁看输出的原始二进制数据
posE = instrb(posB,binData,bytSub)
objFi

[1] [2]  下一页

共有0人参与评价,平均得分:0分
评论内容只代表网友观点,与本站立场无关! 查看完整内容
   

当前在线人数
QQ:748838 MSN:allen_xia#msn.com E-mail:allenxia666#126.com QQ群:站长联盟北方区-北京(28200145) 站长联盟南方区-上海(67713522)