# Saturday, May 05, 2007

    最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关的协议,有的则说不用很了解。个人认为这要分层次来看待这个问题,对于一个新手或者刚入门的web开发人员而言,研究协议方面的东西可能会使得web开发失去趣味性、抹煞学习积极性,这类人应该更多的了解基本的Web技术使用。而对于在该行业工作多年的老鸟来说,协议相关的内容、标准相关内容应该尽量多些的了解,因为只有这样才能使得经手的web系统更加优秀(安全、漂亮、快速、兼容性好、体验好……)。本文我们来说一下MIME 协议的一个扩展Content-disposition。

    我们在开发web系统时有时会有以下需求:

  • 希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框
  • 希望以原始文件名(上传时的文件名,例如:山东省政府1024号文件.doc)提供下载,但服务器上保存的地址却是其他文件名(如:12519810948091234_asdf.doc)
  • 希望某文件直接在浏览器上显示而不是弹出文件下载对话框
  • ……………………

    要解决上述需求就可以使用Content-disposition来解决。第一个需求的解决办法是

Response.AddHeader "content-disposition","attachment; filename=fname.ext"
 
将上述需求进行归我给出如下例子代码:
public static void ToDownload(string serverfilpath,string filename)
{
    FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
    long fileSize = fileStream.Length;
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + UTF_FileName(filename) + "\";");
    ////attachment --- 作为附件下载
    ////inline --- 在线打开
    HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
    byte[] fileBuffer = new byte[fileSize];
    fileStream.Read(fileBuffer, 0, (int)fileSize);
    HttpContext.Current.Response.BinaryWrite(fileBuffer);
    fileStream.Close();
    HttpContext.Current.Response.End();
}

public static void ToOpen(string serverfilpath, string filename)
{
    FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
    long fileSize = fileStream.Length;
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=\"" + UTF_FileName(filename) + "\";");
    HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
    byte[] fileBuffer = new byte[fileSize];
    fileStream.Read(fileBuffer, 0, (int)fileSize);
    HttpContext.Current.Response.BinaryWrite(fileBuffer);
    fileStream.Close();
    HttpContext.Current.Response.End();
}

private static string UTF_FileName(string filename)
{
    return HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}

 

简单的对上述代码做一下解析,ToDownload方法为将一个服务器上的文件(serverfilpath为服务器上的物理地址),以某文件名(filename)在浏览器上弹出“文件下载”对话框,而ToOpen是将服务器上的某文件以某文件名在浏览器中显示/打开的。注意其中我使用了UTF_FileName方法,该方法很简单,主要为了解决包含非英文/数字名称的问题,比如说文件名为“衣明志.doc”,使用该方法客户端就不会出现乱码了。

 需要注意以下几个问题:

  1. Content-disposition是MIME协议的扩展,由于多方面的安全性考虑没有被标准化,所以可能某些浏览器不支持,比如说IE4.01
  2. 我们可以使用程序来使用它,也可以在web服务器(比如IIS)上使用它,只需要在http header上做相应的设置即可

可参看以下几篇文档:

posted on Saturday, May 05, 2007 3:03:14 AM (China Standard Time, UTC+08:00)  #    Comments [0]
# Saturday, November 04, 2006
烟台.Net俱乐部网站近几日出现了异常报告,于是调查了一下站点的IIS日志,进行了分析,发现了100次以上的非法访问的IP情况如下:
尝试次数 IP地址 所属地区
4904 211.64.120.192 山东省济南市 山东交通大学
223 74.6.74.159 美国
190 222.80.77.209 新疆喀什市 电信
181 202.108.211.101 北京市 网通
160 222.183.217.187 重庆市江北区 电信ADSL
148 124.156.191.67 中国
112 222.88.189.247 河南省鹤壁市 电信ADSL
100 220.169.248.6 湖南省衡阳市

以这里的第一名211.64.120.192的访问情况为例,其访问的俱乐部网站路径如下:

于是乎把他的IP封锁了,索然这本身没有什么效果,但是对该“黑客”的行为表示痛恨。不过呢其实最痛恨的也不是他啦,最痛恨的是那些疯狂的搜索引擎爬虫,baidu,sogou的爬虫都不是什么好鸟。而且看到很多网站在为这个问题而头痛,希望大家一起努力可以想到一个好的办法来解决这个问题。近期我也会尝试分析和解决这个问题。

posted on Saturday, November 04, 2006 9:33:44 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Friday, June 02, 2006
虽然 Apache 的名声可能比 IIS 好,但我相信用 IIS 来做 Web 服务器的人一定也不少。说实话,我觉得 IIS 还是不错的,尤其是 Windows 2003 的 IIS 6(马上 Longhorn Server 的 IIS 7 也就要来了,相信会更好),性能和稳定性都相当不错。但是我发现许多用 IIS 的人不太会设置 Web 服务器的权限,因此,出现漏洞被人黑掉也就不足为奇了。但我们不应该把这归咎于 IIS 的不安全。如果对站点的每个目录都配以正确的权限,出现漏洞被人黑掉的机会还是很小的(Web 应用程序本身有问题和通过其它方式入侵黑掉服务器的除外)。下面是我在配置过程中总结的一些经验,希望对大家有所帮助。
posted on Friday, June 02, 2006 1:13:14 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Tuesday, March 28, 2006

近一段时间一直忙于公司的项目,无暇来更新技术博客。最近几天将会做一些补充。
公司的服务器在近一个月的时间内时常崩溃,由于我们项目组开发的网站访问量远超过服务器上其他的网站,所以服务器管理员认为是我们的网站程序造成的系统崩溃。但是事实是怎么样的呢?请见以下描述:


服务器管理人员(管):你看服务器的负荷又被你们的网站占了99%,服务器崩溃了。你看一个w3wp.exe进程的cpu消耗是99%。其他客户的网站都是小型程序不可能是他们造成的,肯定是你们造成的。
:我们的网站是不好用了哦,难道真是我们的问题……我回去瞧瞧。(暗地在想,日访问量最多4万的站,不至于让我的程序这样吧)


回去后我不断的修改程序中隐藏的瑕疵,并尽量避免服务器在访问高峰更新程序,但是服务器仍然时常崩溃,频率逐渐提高,最常的时候竟然是一天3次。郁闷……什么原因呢?
今日,服务器管理人员又把我喊过去,说:"你们看看吧,服务器又崩了,你们看看怎么办?我心理就郁闷了,我说你怎么就那么肯定是我们程序的进程造成的呢?"……一阵子罗嗦后,我说:"你把我们的站点和进程池关闭,然后重新启动服务器"……几分钟后,服务器启动了,我们的网站处于关闭状态,结果服务器仍然有个w3wp.exe的cpu消耗居高不下,我说这肯定不是我们的问题了。他们也知道自己判断失误了,但是并没有道歉。我回办公室测试,发现网站的数据维护程序有个一直无法正常使用,因为cpu都被一个非我们网站的w3wp.exe给占了,怎么办?于是自己就开始研究如何处理,并与服务器管理人员一起合作查找那个w3wp.exe的真正归宿,可是任务管理器里只有pdi号没有办法直接看到所属的服务器进程池啊。怎么办?google一下。
找到了微软的文档:Iisapp.vbs:IIS 应用程序查询脚本 于是在服务器上运行iisapp.vbs脚本,并根据pid查出了对应的w3wp的进程池归属,发现是某个客户网站的程序造成的,但是由于早期管理人员并没有将客户网站适当分配进程池,百余个网站在一个默认进程池里,怎么办继续查吧,先按照一定的规则对现有客户网站适当分配进程池,然后利用iisapp.vbs查出是一个济南客户的网站程序造成的,先停掉再说,ok一切正常了。期间发现我们的w3wp.exe进程cpu使用率一直在0-1%之间,而内存消耗也不到130M,心里还是比较满意的。等项目的二期工程时,我们再好好修整一下程序,提高性能并尽量减少服务器负担,以免超大访问量时不至于死掉了,呵呵


相关文章:Iisapp.vbs:IIS 应用程序查询脚本

posted on Tuesday, March 28, 2006 4:15:53 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Monday, January 09, 2006

在使用vbscript进行asp开发时,一些朋友会碰到以下类似的错误:
Microsoft VBscript 运行时错误 '800a000d'
类型不匹配: '*******'
/solweb/sdbottm_right.asp, line 80

错误原因:
该错误是因为在运行iis服务的windows 2003 server上安装了Internet Explorer 6 Service Pack 1 (KB832894)安全更新造成的。

解决方案:
要纠正该问题,请下载并安装Q831167.exe(http://www.microsoft.com/downloads/details.aspx?amp;amp;displaylang=en&familyid=254EB128-5053-48A7-8526-BD38215C74B2&displaylang=en),可以在Windows Server 2003机器上阅读微软知识库831167 http://support.microsoft.com/default.aspx?kbid=831167 了解一些相关信息。

posted on Monday, January 09, 2006 9:09:09 PM (China Standard Time, UTC+08:00)  #    Comments [1]
# Wednesday, June 15, 2005

<%
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'数据库操作类
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'名称:Class_DBOperate
'版本:0.2
'作者:qihangnet
'更新:2005年6月14日
'作用:简化数据库操作的流程
'授权:免费使用
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Class Class_DBOperate

'************************************
'变量定义
'************************************
'Conn ---------- 数据库连接对象
'Conn_Str ------ 数据库连接字符串

Private Conn,Conn_Str

'************************************
'实例 初始化/终止
'************************************

Private Sub Class_Initialize()
Set Conn = Server.CreateObject("ADODB.Connection")
End Sub

Private Sub Class_Teriminate()
Set Conn = Nothing
End Sub

'************************************
'属性
'************************************

'输出数据库连接字符串
' 返回值类型:string

Property Get ConnectString
ConnectString = Conn_Str
End Property

'设置数据库连接字符串(数据库连接字符串)
' 参数:str --- string

Property Let ConnectString(str)
Conn_Str = str
End Property

'************************************
'事件
'************************************

'数据库打开
Public Sub DB_Open() 。
Conn.ConnectionString = Conn_Str
Conn.Open
End Sub

'数据库关闭
Public Sub DB_Close()
Conn.Close
End Sub

'************************************
'方法
'************************************

'数据库查询(sql语句)
' 参数及类别:sql ---- string
' 返回值类型:记录集
' 前提:数据库状态为打开

Public Function DB_Select(sql)
Set DB_Select = Conn.Execute(sql)
End Function

'数据库执行(SQL语句)
' 参数及类别:sql ---- string
' 返回值类型:整形
' 返回值含义:受影响行数
' 前提:数据库状态为打开

Public Function DB_Excute(sql)
Dim rs_affected
Conn.Execute sql,rs_affected
DB_Excute = rs_affected
End Function

End Class
%>

posted on Wednesday, June 15, 2005 11:50:26 AM (China Standard Time, UTC+08:00)  #    Comments [0]

<%
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'快速字符串连接类
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'名称:Class_FastString
'来源:http://www.jansfreeware.com
'整理:qihangnet
'更新:2005年6月15日
'作用:高效地进行字符串连接,比 str = str & "abc"的方法快很多
'授权:免费使用
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Class Class_FastString

'************************************
'变量定义
'************************************
'index --- 字符串数组的下标
'ub ------ 用于调整数组度数的整数变量
'ar() ---- 字符串数组

Private index, ub, ar()

'************************************
'实例 初始化/终止
'************************************

Private Sub Class_Initialize()
Redim ar(50)
index = 0
ub = 49
End Sub

Private Sub Class_Terminate()
Erase ar
End Sub

'************************************
'事件
'************************************

'默认事件,添加字符串
Public Default Sub Add(value)
ar(index) = value
index = index+1
If index>ub Then
ub = ub + 50
Redim Preserve ar(ub)
End if
End Sub

'************************************
'方法
'************************************

'返回连接后的字符串
Public Function Dump
Redim preserve ar(index-1)
Dump = join(ar,"") '关键所在哦^_^
End Function

End class
%>

posted on Wednesday, June 15, 2005 11:41:18 AM (China Standard Time, UTC+08:00)  #    Comments [0]
# Sunday, May 29, 2005

  过去在一家软件外企工作时写过一个小的web实验性项目,其中一部分需求是用户界面的多种语言(简体中文、繁体中文、英语、朝鲜语、日语)支持,当时使用了模板技术来实现了该需求,并用Cookies保存了用户的设置,但是用户第一次登陆时(或者是将Cookies删除了以后)仍然需要选择语言种类,那么能不能更方便用户呢?能不能用程序来自动帮助选择呢?
  答案是肯定的,大家都在用google,你用中文系统打开google的首页,打开的自然是中文首页,而不会是其他语言。因为google会自动判断用户系统使用的首选语言是什么。
  怎样才能做到像google那样呢,其实很简单,
  在浏览器发给web服务器的 HTTP Headers Information 中包含了这样一个信息 Accept-Language,这个信息就是,浏览器中 工具->gt;Internet选项->gt;常规 下的 语言, 它就是用来设置浏览器可接受的语言首选项的, 它可以是多种可接受语言的优先排序列。
 
下面我以asp为例简单介绍一下“如何来自动判断用户语言”:

<%
Function RegExpTest(patrn, strng)
  Dim regEx,Match,Matches'建立变量。
  Set regEx = New RegExp'建立正则表达式。
  regEx.Pattern = patrn'设置模式。
  regEx.IgnoreCase = True'设置是否区分字符大小写。
  regEx.Global = True'设置全局可用性。
  Set Matches = regEx.Execute(strng)'执行搜索。
  For Each Match in Matches'遍历匹配集合。
        RetStr = RetStr&Match.Value
  Next
  RegExpTest = RetStr
End Function
AL = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")'获取用户浏览器可接受语言参数
LG = RegExpTest("^[a-z\-]+",AL)'获取用户浏览器可接受语言的首选项
select case LG
 case "zh-cn"
        response.write "中文(中国)"
 case "zh-tw"
        response.write "中文(台湾)"
 case "zh-mo"
        response.write "中文(澳门特别行政区)"
 case "zh-hk"
        response.write "中文(香港特别行政区)"
 case "zh-sg"
        response.write "中文(新加坡)"
 case "en-us"
        response.write "英语(美国)"
 case "ja"
        response.write "日语"
 case "ko"
        response.write "朝鲜语"
end select
%>
   

posted on Sunday, May 29, 2005 10:19:53 PM (China Standard Time, UTC+08:00)  #    Comments [2]
# Wednesday, May 04, 2005
<%

Function BytesToBstr(body,Cset)
   
dim objstream
   
set objstream = Server.CreateObject("adodb.stream")
    objstream.Type
= 1
    objstream.Mode
=3
    objstream.Open
objstream.Write body
    objstream.Position
= 0
    objstream.Type
= 2
    objstream.Charset
= Cset
    BytesToBstr
= objstream.ReadText
    objstream.Close
   
set objstream = nothing
End Function

url
=request.form("url")
if trim(url)<>"" then
   
set xml = Server.CreateObject("MSXML2.XMLHTTP.5.0")
    xml.open
"GET",url, False
    xml.send
    bo
= BytesToBstr(xml.ResponseBody,"UTF-8")
    header
= xml.GetAllResponseHeaders
   
set xml = nothing
end if

%>
<html>

<head>
<title>XMLHTTP测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>

<body bgcolor="#D4D0C8" topmargin="20" leftmargin="0" rightmargin="0" bottommargin="0" marginwidth="0" marginheight="0">

<div align="center">
   
<table border="1" width="770px" cellspacing="0" cellpadding="0" bordercolorlight="#808080" bordercolordark="#FFFFFF" height="356">
       
<tr>
           
<form method="post">
               
<td align="center" height="50">
               
<input type="text" name="url" style="width:700;height:20" value="<%=url%>">
               
<input type="submit" value="查看"> </td>
           
</form>
       
</tr>
       
<tr>
           
<td align="center" height="124">
           
<textarea id="Textarea2" name="Textarea2" rows="7" cols="105"><%=header%></textarea></td>
       
</tr>
       
<tr>
           
<td height="230" align="center">
           
<textarea id="Textarea1" name="Textarea1" rows="14" cols="105"><%=bo%></textarea></td>
       
</tr>
   
</table>
</div>

</body>

</html>
posted on Wednesday, May 04, 2005 11:04:32 AM (China Standard Time, UTC+08:00)  #    Comments [0]
# Tuesday, April 12, 2005
引自http://www.2solo.net/blog/showlog.asp?cat_id=27&log_id=494的一篇关于在Asp中如何实现ZT条型码的例子。有一定的学习和参考价值,在此推荐给大家。
posted on Tuesday, April 12, 2005 11:16:56 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Monday, April 04, 2005
asp爱好者们经常喜欢从网上下载免费代码,但是却经常遇到一个问题:代码被加密了!!我们知道这些代码是可以解密的,网上有很多解密工具:) 。本文提供了利用asp技术来批量解码被加密的asp文件的例程,希望能对大家有所帮助。
posted on Monday, April 04, 2005 4:58:26 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Wednesday, March 23, 2005
中国电话号码验证
匹配形式如:0511-4405222 或者021-87888822 或者 021-44055520-555 或者 (0511)4405222
正则表达式 "((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*"

中国邮政编码验证
匹配形式如:215421
正则表达式 "d{6}"

电子邮件验证
匹配形式如:justali@justdn.com
正则表达式 "w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*"

身份证验证
匹配形式如:15位或者18位身份证
正则表达式 "d{18}|d{15}"

常用数字验证
正则表达式 
"d{n}" n为规定长度
"d{n,m}" n到m的长度范围

非法字符验证
匹配非法字符如:< > & / ' | 
正则表达式 [^<>&/|'\]+

日期验证
匹配形式如:20030718,030718
范围:1900--2099
正则表达式((((19){1}|(20){1})d{2})|d{2})[01]{1}d{1}[0-3]{1}d{1}
posted on Wednesday, March 23, 2005 5:04:12 PM (China Standard Time, UTC+08:00)  #    Comments [3]
早就写好的,本不想放出来,毕竟用L-Blog的人很多,但如果被人恶意利用那就天下大乱了,所以....
本文只写出了漏洞的存在,并没有写具体如何操作入侵,希望Loveyuki看了赶紧修补。

涉及版本:
^^^^^^
L-Blog官方所有版本(进入后台漏洞只存在于L-Blog 1.06 (SE) Final和L-Blog 1.08 (SE) Final)

危害:
^^^^
普通会员可以发表、修改、删除日志,可以直接进入后台管理。怕怕 。

描述:
^^^^
L-Blog是一款由Loveyuki开发的源代码开放的Asp Blog,由于其用户验证采用Cookies方式,而又没对其进行严格校验,进而威胁整个Blog或服务器安全。

具体:
^^^^
很简单的Cookies欺骗,我想就不用我说了吧,至于如何进入后台,也很简单,’ or ‘1’=’1,很经典也很古老的漏洞,想不到Loveyuki会犯这样的低级错误!

解决方案:
^^^^^^
个人觉得可以加入数据库的校验,也可以采用Session,如果不会修改那就等Loveyuki出补丁了。


后记:希望大家不要做任何违法的事情,本站不负任何法律责任。
(此漏洞本站已修补,请不要再试,谢谢合作!)

                                                                                  
                                                                   By sfzhi
                                                                   2004.10
posted on Wednesday, March 23, 2005 4:38:36 PM (China Standard Time, UTC+08:00)  #    Comments [0]
程序代码:
IMGPath="icon_lblog.gif"

Set PP=New ImgWHInfo  
W = PP.imgW(Server.Mappath(IMGPath))  
H = PP.imgH(Server.Mappath(IMGPath)) 
Set pp=Nothing 
 
Response.Write("<img src='"&IMGPath&"' border=0><br>宽:"&W&";高:"&H)

类代码:
<%Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP
    Dim ASO
    Private Sub Class_Initialize
        Set ASO=Server.CreateObject("ADODB.Stream")
        ASO.Mode=3
        ASO.Type=1
        ASO.Open
    End Sub
    Private Sub Class_Terminate
        Err.Clear
        Set ASO=Nothing
    End Sub

    Private Function Bin2Str(Bin)
        Dim I, Str
        For I=1 To LenB(Bin)
            clow=MidB(Bin,I,1)
            If ASCB(clow)<128 Then
                Str = Str & Chr(ASCB(clow))
            Else
                I=I+1
                If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
            End If
        Next
        Bin2Str = Str
    End Function
      
    Private Function Num2Str(Num,Base,Lens)
        Dim Ret
        Ret = ""
        While(Num>=Base)
            Ret = (Num Mod Base) & Ret
            Num = (Num - Num Mod Base)/Base
        Wend
        Num2Str = Right(String(Lens,"0") & Num & Ret,Lens)
    End Function
      
    Private Function Str2Num(Str,Base)
        Dim Ret,I
        Ret = 0
        For I=1 To Len(Str)
            Ret = Ret *base + Cint(Mid(Str,I,1))
        Next
        Str2Num=Ret
    End Function
      
    Private Function BinVal(Bin)
        Dim Ret,I
        Ret = 0
        For I = LenB(Bin) To 1 Step -1
            Ret = Ret *256 + AscB(MidB(Bin,I,1))
        Next
        BinVal=Ret
    End Function
      
    Private Function BinVal2(Bin)
        Dim Ret,I
        Ret = 0
        For I = 1 To LenB(Bin)
            Ret = Ret *256 + AscB(MidB(Bin,I,1))
        Next
        BinVal2=Ret
    End Function
      
    Private Function GetImageSize(filespec)
        Dim bFlag
        Dim Ret(3)
        ASO.LoadFromFile(filespec)
        bFlag=ASO.Read(3)
        Select Case Hex(binVal(bFlag))
        Case "4E5089":
            ASO.Read(15)
            ret(0)="PNG"
            ret(1)=BinVal2(ASO.Read(2))
            ASO.Read(2)
            ret(2)=BinVal2(ASO.Read(2))
        Case "464947":
            ASO.read(3)
            ret(0)="gif"
            ret(1)=BinVal(ASO.Read(2))
            ret(2)=BinVal(ASO.Read(2))
        Case "535746":
            ASO.read(5)
            binData=ASO.Read(1)
            sConv=Num2Str(ascb(binData),2 ,8)
            nBits=Str2Num(left(sConv,5),2)
            sConv=mid(sConv,6)
            While(len(sConv)<nBits*4)
                binData=ASO.Read(1)
                sConv=sConv&Num2Str(AscB(binData),2 ,8)
            Wend
            ret(0)="SWF"
            ret(1)=Int(Abs(Str2Num(Mid(sConv,1*nBits+1,nBits),2)-Str2Num(Mid(sConv,0*nBits+1,nBits),2))/20)
            ret(2)=Int(Abs(Str2Num(Mid(sConv,3*nBits+1,nBits),2)-Str2Num(Mid(sConv,2*nBits+1,nBits),2))/20)
        Case "FFD8FF":
            Do  
            Do: p1=binVal(ASO.Read(1)): Loop While p1=255 And Not ASO.EOS
            If p1>191 And p1<196 Then Exit Do Else ASO.read(binval2(ASO.Read(2))-2)
            Do:p1=binVal(ASO.Read(1)):Loop While p1<255 And Not ASO.EOS
            Loop While True
            ASO.Read(3)
            ret(0)="JPG"
            ret(2)=binval2(ASO.Read(2))
            ret(1)=binval2(ASO.Read(2))
        Case Else:
            If left(Bin2Str(bFlag),2)="BM" Then
                ASO.Read(15)
                ret(0)="BMP"
                ret(1)=binval(ASO.Read(4))
                ret(2)=binval(ASO.Read(4))
            Else
                    ret(0)=""
            End If
        End Select
        ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &""""
        getimagesize=ret
    End Function
      
    Public Function imgW(IMGPath)
        Dim FSO,IMGFile,FileExt,Arr
        Set FSO = Server.CreateObject("Scripting.FileSystemObject")
        If (FSO.FileExists(IMGPath)) Then
            Set IMGFile = FSO.GetFile(IMGPath)
            FileExt=FSO.GetExtensionName(IMGPath)
            Select Case FileExt
                Case "gif","bmp","jpg","png":
                Arr=GetImageSize(IMGFile.Path)
                imgW = Arr(1)
            End Select
            Set IMGFile=Nothing
        Else
            imgW = 0
        End If    
        Set FSO=Nothing
    End Function
    
    Public Function imgH(IMGPath)
        Dim FSO,IMGFile,FileExt,Arr
        Set FSO = server.CreateObject("Scripting.FileSystemObject")
        If (FSO.FileExists(IMGPath)) Then
            Set IMGFile = FSO.GetFile(IMGPath)
            FileExt=FSO.GetExtensionName(IMGPath)
            Select Case FileExt
                Case "gif","bmp","jpg","png":
                Arr=getImageSize(IMGFile.Path)
                imgH = Arr(2)
            End Select
            Set IMGFile=Nothing
        Else
            imgH = 0
        End If    
        Set FSO=Nothing
    End Function
End Class
%>
posted on Wednesday, March 23, 2005 4:32:47 PM (China Standard Time, UTC+08:00)  #    Comments [0]