针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2654730 建立时间:2005年1月1日 |
|

| |
一个表单提交到多个页面
|
form.submit中控制。。。。 <html> <script language=javascript> function dosubmit(){ window.open('first.php?var1='+window.form.var1.value+'&var2='+window.form.var2.value); window.open('second.php?var1='+window.form.var1.value+'&var2='+window.form.var2.value); return false; } </script> <form name=form onsubmit="return dosubmit();"> <input type=text name=var1><br> <input type=text name=var2> <br><input type=submit></form> |
|
HTML在线编辑器
|
================使用说明======== 1.你需要将所有文件传至你的空间。 2.调用方法:首先装载:_editor_url=""引号中间填该程序所在路径。 =============================== <script language="Javascript1.2"><!-- // load htmlarea _editor_url = ""; // URL to htmlarea files var win_ie_ver = parseFloat(navigator.appVersion.split("MSIE")[1]); if (navigator.userAgent.indexOf('Mac') >= 0) { win_ie_ver = 0; } if (navigator.userAgent.indexOf('Windows CE') >= 0) { win_ie_ver = 0; } if (navigator.userAgent.indexOf('Opera') >= 0) { win_ie_ver = 0; } if (win_ie_ver >= 5.5) { document.write('<scr' + 'ipt src="' +_editor_url+ 'editor.js"'); document.write(' language="Javascript1.2"></scr' + 'ipt>'); } else { document.write('<scr'+'ipt>function editor_generate() { return false; }
</scr'+'ipt>'); } // --></script> 然后调用:('x')括号中的x为textarea的名字(是name不是id) =============================== <script language="javascript1.2"> editor_generate('x'); </script> ======================================= 下载: 里面的test.htm为一个演示页面。
htmlarea.zip |
|
超强动画
|
游標點在小窗上?~連續點 page down 鍵~
竟然有人用文字打成這樣....
---------------------------------------------------------------------------
----
請連續按 Page Down 鍵
後面比較好笑
|
=|--|
V' |
|
o |
/|\o |
_____________/_\____________________________________________________|
|
=|--|
V' |
|
o |
/|\ |
________________/_>_o_______________________________________________|
|
=|--|
V' |
|
o |
/|\o |
____________________>\______________________________________________|
|
=|--|
V' |
|
o |
/|\ |
______________________/_>_o_________________________________________|
|
=|--|
V' |
|
o |
/|-o |
__________________________>\________________________________________|
|
=|--|
V' |
|
o |
/|\ |
____________________________/_>_o___________________________________|
|
罰球線到了! =|--|
V' |
|
o |
/|-o |
________________________________>>__________________________________|
|
=|--|
o V' |
o/ |
/| |
>\ |
____________________________________________________________________|
|
o =|--|
o| V' |
/| |
/ > |
|
____________________________________________________________________|
o |
o| =|--|
/| V' |
>\ |
|
|
____________________________________________________________________|
o
o/ |
/| =|--|
/ > V' |
|
|
|
____________________________________________________________________|
o
o/ |
/| =|--|
/ \ V' |
|
|
|
____________________________________________________________________|
o |
o/=|--|
/| V' |
// |
|
|
____________________________________________________________________|
|
=|--|
φ' |
o |
-|\ |
>> |
____________________________________________________________________|
|
=|--|
V' |
o |
o |
/|\|
__________________________________________________________________>>|
|
=|--|
V' |
|
o o |
/|- |
________________________________________________________________/_\_|
|
=|--|
V' |
帥氣吧? 呵呵~~~ |
o |
o /|\ |
_______________________________________________________________/_\__|
----------------------------------------------------------------------------
----
請連續按 Page Down 鍵
春麗 V.S. 龍
o o
<|- Round 1 -|>
>> <<
==========================================================================
春麗 V.S. 龍
o o
<|- Round 1 Fight! -|>
>> <<
==========================================================================
o o
<|- Fight! -|>
X X
==========================================================================
o o
<|- -|>
/ \ / \
==========================================================================
o o
<|- -|>
X X
==========================================================================
o o
<|- -|>
X X
==========================================================================
咿~
o o
<|- ^v|>
/ \ / \
==========================================================================
o/ 呀~
< \ o ==
/ > ^-|>==
< \==
==========================================================================
嘿
o/ 啊~
< \ o =
/ > ^-|>=
/< =
==========================================================================
o/
< \
< \ o
-|>
<<
==========================================================================
o/ 波動拳!
< \ o
/ > v\^*
/ >
==========================================================================
波動拳!
o o
/V * ==\
>> < \
==========================================================================
咦? /
o - o
/V \ *--- ==\
>> < \
==========================================================================
奔雷掌!
o o
/==**----- ==\
/ > < \
==========================================================================
奔雷掌! 碰!
o / \ |/ o
< \ - * - ==\
\\ /| \ < \
==========================================================================
呀~ 碰!
o / \ |/ o
< \ - * - ==\
\\ /| \ < \
==========================================================================
呀~ 碰! 喝~
o / \ / o ==
< \ - * - ==\ ==
\\ / \ < \ ==
==========================================================================
旋轉踢! 咻~
o 嘶... o ======
/\\ * v\^ =====
>> < \ ======
==========================================================================
呀啦啦啦啦~ 呃!
_____ _ o ====
| \^ ===
^o^ < \ ====
==========================================================================
呀啦啦啦啦~
_ _ o
| / >
^o^ < \
==========================================================================
呀啦啦啦啦~
_____ \o 唉呀!
| */ \
^o^ //
==========================================================================
呀啦啦啦啦~
___ \ o 啊~
| */ \
^o^ //
==========================================================================
呀啦啦啦啦~喝!
_____ ___//
\|/ * // o 哇!!!
o
==========================================================================
喝呀! __\
o_/ \ _ 唔~
// V / o
==========================================================================
| /
o____ /
// V / o\
==========================================================================
o
/\\ o__/
>> // \
==========================================================================
咿~__ o
/ o
/ > //\
<<
==========================================================================
呀~ o _
/ \
< \ o _ 昇龍拳!
* \
/ >
==========================================================================
啊~
o _
/ \ *
< \ \ o _ 昇龍拳!
\
< \
==========================================================================
啊! o _
/ \ * 碰!
\ \ \ o _ 喝!
\
< \
\\\
==========================================================================
o _
啊! / \ * 碰!
\\ \ o _ 喝!
\
< \
\\\
\\\
==========================================================================
o/____ 碰!
/ \ *
呀~ \ o _
\
< \
\\\
\\\
==========================================================================
____
o \ \
\o_ 呵哈!
呃~ |
/ >
==========================================================================
___
o\ \ _o/
唔~ |
< \
==========================================================================
___ _o_
o\ \ |
/ >
==========================================================================
_o_
|
___/ / >
o\
==========================================================================
_o_
| You Lose!
o/__/ 咚! / \
==========================================================================
\o_
趴! | You Lose!
____ / \
=====o\==================================================================
\o_
| You Lose!
____ / \
=====o\==================================================================
哈哈,下一個是誰?
\o_
Game Over! | You Lose!
____ / \
=====o\==================================================================
----------------------------------------------------------------------------
----
>> > >請連續按 Page Down 鍵
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o ___
>> > > /|\ /___\______
>> > >__/_\__/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o ___
>> > > /|\ /___\______
>> > >___/_\_/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o ___
>> > > |=/___\______
>> > >_____/>/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > /|\
>> > > //_\\______
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > _/|\
>> > > /_/_\______
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___/|\
>> > > /___/_\____
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___ /|\
>> > > /___\/_\___
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___ /|\
>> > > /___\_/_\__
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___ /|\
>> > > /___\__/_\_
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___ /|\
>> > > /___\____/_\
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___ |=
>> > > /___\______|
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___ o
>> > > /___\__ |=
>> > >_______/____|_ ---_>
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > ___ |=
>> > > /___\______>
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > /=
>> > > ___ _>
>> > > /___\___---
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > o
>> > > /=
>> > > /
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > __o
>> > > / \
>> > > ___
>> > > /___\_____
>> > >_______/____|_ --
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ____o
>> > > ___ \
>> > > /___\_______
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > __
>> > > ___ \o
>> > > /___\_______ \
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___ \
>> > > /___\_______ \o
>> > >_______/____|_ \
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______ \
>> > >_______/____|_ \
>> > > | |o
>> > > |
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_ \|
>> > > | |
>> > > | |o
>> > > |~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > | \|
>> > > | ' |..'
>> > > |~~~~~~~~~~~~~~~~~~~/o'~~~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_ . .
>> > > | . '. '
>> > > | '.\/..'.
>> > > |~~~~~~~~~~~~~~~~~~~~~~/,~~~~
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > | .'..''..
>> > > | . .'.' '
>> > > |~~~~~~~~~~~~~~~~~~~~~~;|/,~~
>> > > _o/
>> > > /
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > | . .
>> > > | ..'.'.
>> > > |~~~~~~~~~~~~~~~~~~~~~~;,;~~~
>> > > _o__/'
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > |
>> > > | . .
>> > > |~~~~~~~~~~~~~~~~~~~~~~~;~~~~
>> > > o__// ''
>> > > //
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > |
>> > > |
>> > > |~~~~~~~~~~~~o~~~~~~~~~~~~~~~
>> > > |\__
>> > > \
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > |
>> > > | o
>> > > |~~~~~~~~~/|\~~~~~~~~~~~~~~~~
>> > > / \
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > |
>> > > | o/
>> > > |~~~~~~~~~/|~~~~~~~~~~~~~~~~~
>> > > / \
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > ___
>> > > /___\_______
>> > >_______/____|_
>> > > | ,哈哈! 厲害吧!!
>> > > | o/
>> > > |~~~~~~~~~/|~~~~~~~~~~~~~~~~~
>> > > / \
|
|
防止ACCESS数据库被下载的9种方法
|
篇首语:原来改.mdb为.asp就能防下载是鬼话。
引子:昨天和animator试验了一下,把data.mdb文件改名为data.asp文件后放在wwwroot目录里。然后 在IE中输入data.asp路径后,发现IE显示一片空白,右键->察看源文件,跳出记事本,将内容另存为.mdb文件 ,用ACCESS打开,发现需要密码,也就是说至少文件头被破坏。 然后用Flashget试验下载data.asp文件,并另存为data.mdb文件,发现用ACCESS打开完好无损!!!看 来,好一些编程人员在开发的时候都认为,改了mdb后缀为asp就能防下载的概念,是错的!后台数据库被下载对于一个asp+access的网站来说无疑是一场惨绝人寰的灾难。今天找了各方的文章,归纳一下有以下9种办法防止数据库被下载(欢迎补充):
1.发挥你的想象力 修改数据库文件名 不用说,这是最最偷懒的方法,但是若攻击者通过第三方途径获得了数据库的路径),就玩完了。比如说攻击者本来只能拿到list权 ,结果意外看到了数据库路径,就可以冠冕堂皇地把数据库下载回去研究了。另外,数据文件通常大小都比较大,起再隐蔽的文件名都瞒不了人。故保密性为最低。
2.数据库名后缀改为ASA、ASP等
此法须配合一些要进行一些设置,否则就会出现本文开头的那种情况
(1)二进制字段添加(此招我还没有炼成-_-+)。
(2)在这个文件中加入<%或%>,IIS就会按ASP语法来解析,然后就会报告500错误,自然不能下载了。可是 如果只是简单的在数据库的文本或者备注字段加入<%是没用的,因为ACCESS会对其中的内容进行处理,在数据库里他会以 < %的形式存在,无效!正确的方法是将<%存入OLE对象字段里,这样我们的目的就能达到了。 操作方法: 首先,用记事本或任何文本编辑工具新建一个内容为 <% 的文本文件,随便起个名字存档。 接着,用Access打开您的数据库文件,新建一个表,随便起个名字,在表中添加一个OLE对象的字段,然后添加一个记录, 插入之前建立的文本文件,如果操作正确的话,应该可以看到一个新的名为"数据包"的记录。即可
3.数据库名前加"#" 只需要把数据库文件前名加上#、然后修改数据库连接文件(如conn.asp)中的数据库地址。原理是下载的时候只能识别#号前名的部分,对于后面的自动去掉,比如你要下载:http://www.pcdigest.com/date/# 123.mdb(假设存在的话)。无论是IE还是FLASHGET等下到的都是http://www.test.com/date/index.htm(index.asp、default.jsp等你在IIS设置的首页文档) 另外在数据库文件名中保留一些空格也起到类似作用,由于HTTP协议对地址解析的特殊性,空格会被编码为"%",如http ://www.test.com/date/123 456.mdb,下载的时http://www. test.com/date/123%20456.mdb。而我们的目录就根本没有123%456.mdb这个文件,所以下载也是无效的这样的修改后,即使你暴露了数据库地址,一般情况下别人也是无法下载!
4.加密数据库 首先在选取"工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接 着会出现"数据库加密后另存为"的窗口,存为:employer1.mdb。接着employer.mdb就会被编码,然后存为 employer1.mdb..要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他 人使用别的工具来查看数据库文件的内容。 接下来我们为数据库加密,首先以打开经过编码了的 employer1.mdb,在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码,接着输入密码即可。这样即使他人得到了employer1.mdb文件,没有密码他是无法看到 emplo yer1.mdb的。 加密后要修改数据库连接页,如: conn.open "driver={microsoft access driver&nb sp;(*.mdb)};uid=admin;pwd=数据库密码;dbq=数据库路径" 这样修改后,数据库即使被人下载了,别人也无法打开(前提是你的数据库连接页中的密码没有被泄露) 但值得注意的是,由于Access数据库的加密机制比较简单,即使设置了密码,解密也很容易。该数据库cn-media.com/i-v/index.shtm>系统通过将用户输入的 密码与某一固定密钥进行"异或"来形成一个加密串,并将其存储在*.mdb文件从地址"&H42"开始的区域内。所以一 个好的程序员可以轻松制作一个几十行的小程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,其信息安全依然是个未知数。
5.数据库放在WEB目录外或将数据库连接文件放到其他虚拟目录下 如你的WEB目录是e:\webroot,可以把数据库放到e:\data这个文件夹里,在e:\webroot里的数据库连接页中修改数据库连接地址为:"../data/数据库名" 的形式,这样数据库可以正常调用,但是无法下载的,因为它不在WEB目录里!这个方法一般也不适合购买虚拟空间的用户。 不过现在的虚拟空间提供商都提供了这样的目录的。稍微正规点的空间提供商都会提供三个目录 wwwroot database和logfiles。 wwwroot才是你访问的网站的根目录。
6.使用ODBC数据源。 在ASP等程序设计中,如果有条件,应尽量使用ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP源代码 的失密而一同失密,例如: DBPath = Server.MapPath("../123/abc/asfadf.mdb ") conn.open "driver={Microsoft Access Driver&nb sp;(*.mdb)};dbq="& DBPath 可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,也很容易被下载下来。如果使用ODBC数据源,就不 会存在这样的问题了: conn.open "ODBC-DSN名" ,不过这样是比较烦的,目 录移动的话又要重新设置数据源了,更方便的方法请看第7,8法!
7.添加数据库名的如MDB的扩展映射 这个方法就是通过修改IIS设置来实现,适合有IIS控制权的朋友,不适合购买虚拟主机用户(除非管理员已经设置了)。这个 方法我认为是目前最好的。只要修改一处,整个站点的数据库都可以防止被下载。无须修改代码即使暴露目标地址也可以防止下载。&n bsp; 我们在IIS属性---主目录---配置---映射---应用程序扩展那里添加.mdb文件的应用解析。注意这里的选择的D LL(或EXE等)似乎也不是任意的,选择不当,这个MDB文件还是可以被下载的, 注意最好不要选择选 择asp.dll等。你可以自己多测试下 这样修改后下载数据库如:http://www.test.com/data/dvbbs6.mdb。就出现(404或50 0等错误)
8:使用.net的优越性 动网的木鸟就写过一个防非法下载文件的"WBAL 防盗链工具"。具体可以登陆http://www.9seek .com/WBAL/ 不过 那个只实现了防止非本地下载的 ,没有起到真正的防下载数据库的功能。不过这个方法已经跟5法差 不多可以通过修改.NET文件,实现本地也不能下载!
这几个方法中,只有第7和8个是统一性改的,一次修改配置后,整个站点的数据库都可以防止下载,其他几个就要分别修改数据库 名和连接文件,比较麻烦,不过对于虚拟主机的朋友也只能这样了!
其实第6个方法应该是第5个方法的扩展,可以实现特殊的功能,但对于不支持.net的主机或者怕设置麻烦的话,还是直接用第 5个方法了,而且默认情况下第6个方法,依然可以通过复制连接到同主机的论坛或留言本发表,然后就可以点击下载了(因为这样的引 用页是来自同主机的)
9.利用NTFS分区的文件权限设置(by percyboy) 我们已经知道,ASP.NET 中使用 ADO.NET 访问数据库,通过 OleDb 的连接可以访问 Access 数据库— —我们非常常用的低端数据库之一。本文讨论了 ASP.NET 中可能看到的若干错误提示,从中看到&nb sp;Access 2000 和 Access XP 创建的数据库文件 ,在访问出现错误时会出现不太相同的错误提示。希望对大家有所帮助。另一个要点是,希望通过此文,使大家对 ASP. NET 中 Access 数据库文件的 NTFS 权限设置有所新的认识 。
(一)实验过程
为了叙述方便,举个具体例子做个实验:应用程序为 /test ,数据库存放在 D:\wwwroot\test\data\db1.mdb,我们已经知道在 ASP.NET 中是以一个叫做ASPNET 虚拟用户的身份访问数据库的,我们需要给这个账户以特定的 NTFS 权限才能使 ASP.NET 程序正常运行。
为了得到最严格的 NTFS 权限设置,实验开始时我们给程序最低的 NTFS 权限 :
a) D:\wwwroot\test\data\ 文件夹的给用户ASPNET 以如下权限: 允许 拒绝 完全控制 □ □ 修改 □ □ 读取及运行 √ □ 列出文件夹目录 √ □ 读取 √ □ 写入 □ □
b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限: √ 允许将来自父系的可继承权限传播给该 对象
1.1 对于某个只包含有"SELECT"命令的aspx程序,上述权限设置运行时无障碍,即:上述权限 已经满足这类程序的运行了。
1.2 对于包含有"UPDATE""INSERT""UPDATE"等命令的aspx程序, ;
(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,出现如下错误:
"/test"应用程序中的服务器错误。 --------------------------------------- Microsoft Jet 数据库引擎打不开文件D:\wwwroot\test\data\。&n bsp;它已经被别的用户以独占方式打开,或没有查看数据的权限。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: Microsof t Jet 数据库引擎打不开文件D:\wwwroot\test\data\。 它已经被 别的用户以独占方式打开,或没有查看数据的权限。
(b) 如果 db1.mdb 是 Access XP 创建的 数据库,出现如下错误:
"/test"应用程序中的服务器错误。 ---------------------------------------------- 操作必须使用一个可更新的查询。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 操作必须使用一个 可更新的查询。
(c) 原因初步分析:因为包含有"UPDATE""INSERT""UPDATE"等命令,需要对数据库文件本身进 行写入操作,所以上述权限不能满足此需求,我们需要进一步放开权限。
我们放开一些权限, a) D:\wwwroot\test\data\ 文件夹不变: & nbsp;
b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限: 允许 拒绝 完全控制 □ □ 修改 □ □ 读取及运行 √ □ 列出文件夹目录 √ □ 读取 √ □ 写入 √ □
1.3 放开权限后继续实验,
(a) 如果 db1.mdb 是 Access 2000 创建的数据库,出现如下错误:
"/test"应用程序中的服务器错误。 ------------------------------------------ 不能锁定文件。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 不能锁定文件。
(b) 如果 db1.mdb 是 Access XP 创建的 数据库,没有出现错误。
(c) 原因初步分析:我们发现在打开 Access 数据库时,同时会在所在目录生成一个同名 的 *.ldb 文件,这是一个 Access 的锁定标记。鉴于此,我们猜测,用户 ASPNET 访问 Access 数据库时,也需要生成一个锁定标记,而该目录没 有允许其写入,因此出错。至于 Access XP 创建的数据库为什么没有这个错误,原因还不 得而知。
我们进一步放开权限, a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以 如下权限: 允许 拒绝 完全控制 □ □ 修改 □ □ 读取及运行 √ □ 列出文件夹目录 √ □ 读取 √ □ 写入 √ □
b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限: √ 允许将来自父系的可继承权限传播给该 对象
1.4 继续实验,发现错误已解决,那么上面这个权限就是我们需要放开的"最低权限"。
(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,我们会发现一个小问题:生成的 *.ldb 文件不会自己删除,访问后该文件依然存在,但这个 问题不会影响 ASP.NET 的正常运行。
(b) 如果 db1.mdb 是 Access XP 创建的 数据库,没有出现上面类似问题。
(c) 原因初步分析:我们仅仅是给了 ASPNET 以写入文件夹的权限,没有给它修改的权限 ,所以文件一旦写入,便无法修改其内容,*.ldb 也就删除不掉了。
如果非要解决这个问题,进一步放开权限为: a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以 如下权限: 允许 拒绝 完全控制 □ □ 修改 √ □ 读取及运行 √ □ 列出文件夹目录 √ □ 读取 √ □ 写入 √ □
b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限: √ 允许将来自父系的可继承权限传播给该 对象
1.5 附带着,实验另一种情形:我们把 db1.mdb 在 Acce ss 打开编辑,同时访问 ASP.NET。
(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,我们发现并没有出现什么问题。
(b) 如果 db1.mdb 是 Access XP 创建的 数据库,出现如下错误:
"/zhao"应用程序中的服务器错误。 ------------------------------------------------ 不能使用 ;文件已在使用中。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 不能使用&nbs p;;文件已在使用中。
(c) 原因初步分析:Access 数据库是单用户单线程的数据库,我们在 Access&n bsp;里面打开编辑数据库文件时其实是以当前 Windows 用户(比如Administrator) 身份打开数据库,而 ASP.NET 默认使用的是 ASPNET 虚拟用户(隶属于 Users 组),级别低于 Administrator,无法和 Adminis trator "抢夺"权限,所以出现冲突错误。至于 Access 2000 忽略 这个问题的情形我们也不必做讨论了,可能是 Access 2000 没有考虑那么多因素吧。& nbsp;
1.6 再附带一种情形:将 db1.mdb 的属性改为"只读",无论是&nbs p;Access 2000 还是 Access XP 都将分别出现与& nbsp;1.2 中各自的错误相同的错误提示。
(二)实验结论
(1) 我们首先再次总结一下 Access 数据库文件的 NTFS 权 限设置的缘起:
在 ASP.NET 中默认是以一个叫做 ASP.NET的虚拟用户的身份来访问、操作数据库的,你可以在"控制面板"-"管理工具"-"计算机管理"-"本地用户和组"-" 用户"中看到这个用户,默认情况下是:
全名:ASP.NET 计算机帐户 描述为:用于运行 ASP.NET辅助进程(aspnet_wp.exe)的帐户。 隶属于:Users组。
使用这么一个隶属于 Users 组的用户来进行文件操作、数据库操 作的风险是要比用一个 Administrators 组的用户的风险要小得多,这也是 ASP .NET 在安全方面的一个考虑吧。
既然是这么一个用户需要访问、操作数据库文件本身,那么我们就需要给它一定的 NTFS 权限以允许它的访问。显然没有 NTFS 的权限许可,ASPNET 就无 法访问、操作数据库,就会出现上面实验中所看到的那些错误了。
(2) 经过上面的实验,我们已经知道如下的 NTFS 权限设置是可以满足一般需求的:
a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以 如下权限: 允许拒绝 完全控制 □ □ 修改 □ □ 读取及运行 √ □ 列出文件夹目录 √ □ 读取 √ □ 写入 √ □
b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限: √ 允许将来自父系的可继承权限传播给该 对象
同时我们也注意到 db1.mdb 是否为"只读"文件对 ASPNET 的访问也会 有一定影响。
(3) 上述权限设置可以直接设置给 ASPNET 用户自己,也可以设置给 Use rs 组,或者直接给 Everyone 组上述权限都是可以的。因为 ASPNET 隶属于 Users 组,可以通过 用户组 给 ASPNET 设置权限。
(4) NTFS 权限在文件或文件夹右击后得到的"属性"对话框-"安全"选项卡中设置,一般情况下,可 以考虑给 Adminitrators 组以"完全控制"的权限,同时不要轻易在"拒绝"中打勾,有关NTFS 权限设置的技巧,可以咨询网络管理员、网络安全专家的建议。
注:FAT, FAT32 格式的分区中不支持 NTFS 权限。
(5) Windows 2000 系列,Windows Server 2003 系列的"安全"选项卡默认是很容易找到的,但 Windows XP Professional 中的"安全"选项卡默认是关闭的,可以将"控制面板"-"文件夹选项"-"查看"选项卡中的" 高级设置"中"使用简单共享(推荐)"一项的"√"去除,"确定"之后,再次按照上面的方法即可看到"安全"选项卡了。
综上所述,2、3、4法一起使用,是防止数据库被下载最基本,最行之有效的方法,既适用于对服务器有管辖权的网管,又适用于虚拟主机的用户,推荐每一个制作者同时必用这三种方法
若你对服务器拥有管辖权,推荐再加上方法9,你的ACCESS数据库的安全性 就可以大大提高了。 |
|
用ASP实现从SQL Server导出数据到Access
|
方法其实很简单: 需要在SQL Server连接中嵌套一个access连接,然后逐条写入就可以了。
<% set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "driver={SQL server};server=mamaco;uid=linner;pwd=123;dat abase=linner" sql="select * from scjh" set rs=conn.execute (sql) %> <% set Conn1 = Server.CreateObject("ADODB.Connection") param = "driver={Microsoft Access Driver (*.mdb)}" conn.Open param & ";dbq=" & Server.MapPath("scjh.mdb") conn1.execute("delete from scjh") %> <%do while not rs.eof%> <%dim ktdh,scph,scts,jhqtsj,yhxdsj,yxj,rwbh ktdh=rs("ktdh") scph=rs("scph") scts=rs("scts") jhqtsj=rs("jhqtsj") yhxdsj=rs("yhxdsj") yxj=rs("yxj") rwbh=rs("rwbh") %> <%sql1="insert into scjh(ktdh,scph,scts,jhqtsj,yhxdsj,yxj,rwbh) values
('"& ktdh &"','" & scph & "'," & scts & ",'"&jhqtsj&"','"&yhxdsj&"',"&
yxj &"," & rwbh &")" conn1.execute (sql1)%> <%rs.movenext loop conn1.close conn.close%> <%response.redirect "scjh.mdb"%> |
|
ASP.NET文件上传程序的源代码
|
本文件用VB.NET编辑,在WIN2000+IIS(安装有.NET支持)中调试通过,可以上传许多常用的文件类型.如 RAR、ZIP、DOC、TXT、JPG、GIF等等! 直接下载保存为ASPX格式就可以 ------------------------------------------------------------ <html> <title>文件上传</title>
<body> <form enctype="multipart/form-data" runat=server> <Input type=file id=fileup runat=server size="20"><p> <asp:button id=upload_button onclick=uploadfile text="上传" runat=server/> </form> <p> <asp:label id=uptype runat=server/> </body> </html> <script language=VB runat=server> Sub uploadfile(sender as object,e as eventargs) If fileup.postedfile.contentlength=0 Then uptype.text="你还没有选择需要上传的文件!" Else Dim filesplit() as string=split(fileup.postedfile.filename,"\") Dim filename as string=filesplit(filesplit.length-1) fileup.postedfile.saveas(server.mappath(".")&"\"&filename) uptype.text="文件名称:"&fileup.postedfile.filename &"<br>"& _ "文件大小:"&fileup.postedfile.contenttype &"<br>"& _ "文件类型:"&fileup.postedfile.contentlength End If End Sub </script> |
|
常用易懂的精品源码
|
javascript在我们网页设计中,不管是程序员,还是网页设计师,我想大家都不可能在工作中没有用到javascrip,他是我们最基础本最常用的一种脚本,他是在客户端执行,你可以利用他做出很多互动的页面出来,下面是一些很常用的一些javascrip源码,都有相应说明,还有一些结合了我们常用的asp一起结合举例,相信大家看完后,会有一定的收获,偶闪了.
javascript alert()方法
<script language=javascript> alert( "提示,你提交的数量太大了,速度会慢,我们帮你选择了80条数据" ); location.href = "http;//www.cn-media.com/sql10.asp" </script>
asp里的常用用法
<%Response.Write("<script>alert('非法操作!');window.close();</script>")%>
一个for...next小例子
<% for i=1 to 20%> <FONT color=#000fd<%=i%>>media<%=i%></font><br> <%next%>
javascript open()方法
<script language="JavaScript"> <!-- function MM_openBrWindow(theURL,winName,features) { //v2.0 window.open(theURL,winName,features); } window.open('','媒体中国'); //--> </script> 注:上面的open(url,窗口名,"属性列表,他包括有height width top left..等等");下面为最简单的写法
<script language="JavaScript"> open('','媒体中国'); </script>
javascript confirm()方法
显示一个请求确认对话框,包含一个"确定"按钮和一个取消按钮, <script language="JavaScript"> if (confirm("是否确定删除数据?")==true) alert("成功删除数据"); else alert("没有删除数据"); </script>
javascript prompt()方法
功能是显示一个对话框,要求用户输入数据,他的返回值是用户输入的数据. <script language="JavaScript"> var mystr=prompt("请输入你的姓名"); alert("你的名字是:"+mystr); </script>
点击加入收藏夹
<a href="javascript:window.external.AddFavorite (’/’, ’媒体中国’)">添加到收藏夹</a>
设为首页代码
<span onclick="var strHref=window.location.href;this.style.behavior= ’url(#default#3鸟page)’; this.setHomePage(’’); " style="CURSOR: hand"><br>设置为首页</span>
点击关闭浏览器窗口
<a href="javascript:window.close()"><br> 关闭窗口</a>
进入时显示信息
<body bgcolor="#000000" onLoad="window.alert(’媒体中国(www.cn-media.com) \n\n网址:\n\n’)">
离开页面时跳出一个窗口,可以作为显示重要信息的窗口
第一步:把如下代码加入<head>区域中 <script LANGUAGE="JavaScript"> <!-- Begin function leave() { window.open(’media.htm’,’’,’toolbar=no,menubar=no, location=no,height=225,width=235’); } // End --> </script>
第二步:把<body>区域中内容改为: <body bgcolor="#000000" onUnload="leave()">
离开时显示信息
<body bgcolor="#fef4d9" onUnload="window.alert(’谢谢你的光临!欢迎下次再来!’)">
小提示:javascrip他有对象事件处理,最常用的,如下 onUnload(窗口关闭) onload(窗口启动) onfocus(窗口获得焦点) onblur(窗口失去焦点) onerror(窗口中出现错误)
自动添加网页更新日期
<script language="JavaScript"> <!--hide script from old browsers document.write("本站最后更新日期: <br>" + document.lastModified + "")// end hiding --> </script>
小提示: document.write(document.lastModified)的作用是用document对象的write方法把document对象lastModified属性值写到文档中, lastModified属性得到的是最后修改的时间值.
最常见的javascript检验
<script LANGUAGE="JavaScript"> function FormCheck() { if (document.form1.name.value=="") { alert("请填写您的用户名!"); document.form1.name.focus(); return false; } if (document.form1.mail.value=="") { alert("你的邮箱必须填写"); document.form1.mail.focus(); return false; } if (document.form1.3鸟page.value=="") { alert("留言标题"); document.form1.3鸟page.focus(); return false; } if (document.form1.content.value=="") { alert("留言的内容可要填写"); document.form1.content.focus(); return false; } document.form1.submit(); } //focus()他的意思是获得焦点 //document他是javascipt里的一个对象 </SCRIPT>
忽视右键
<body oncontextmenu="return false"> 或 <body style="overflow-y:hidden">
页面自动关闭
<body onload="window.setTimeout(closes.Click(),10000)"> 这个窗口会在10秒过后自动关闭,而且不会出现提示. </body>
返回上一页
<a href=javascript:history.back(1)>『返回上一页』</a>
判断上一页的来源
asp: request.servervariables("http_referer")
javascript: document.referrer
asp环境测试代码
本机ip<%=request.servervariables("remote_addr")%> 服务器名<%=request.servervariables("server_name")%> 服务器ip<%=request.servervariables("local_addr")%> 服务器端口<%=request.servervariables("server_port")%> 服务器时间<%=now%> iis版本<%=request.servervariables"server_software")%> 脚本超时时间<%=server.scripttimeout%> 本文件路径<%=server.mappath(request.servervariables("script_name"))%> 服务器cpu数量<%=request.servervariables("number_of_processors")%> 服务器解译引擎<%=scriptengine&"/" & scriptenginemajorversion &"." & scriptengineminorversion & "." & scriptenginebuildversion%> 服务器操作系统<%=request.servervariables("os")%>
好了,相信上面的大家都很容易看得明白,常用易懂,相信大家学会了不少好东西!有空到我们cn-media的QQ群:4401020里聊. |
|
一个asp文件管理器的源码
|
<SCRIPT LANGUAGE="VBScript" RUNAT="Server"> </SCRIPT> <% Option Explicit Dim action Dim a,b,c,i,item,j Dim arr,tstr
Dim gblPassword gblPassword = "" 'your password here Dim gblSiteName,gblSiteCode gblSiteName = Request.ServerVariables("SERVER_NAME") 'Your site name here gblSiteCode = ""
Dim gblNow 'server may not be local time gblNow = Now
Dim gblFace,gblColor 'needs three quotes gblFace = """Arial, Helvetica, sans-serif""" gblColor = """#000066"""
'global variables
Dim gblTitle,gblPageText gblTitle = " * * * TITLE NOT SET * * * " gblPageText = Null
'global constants
Dim gblScriptName gblScriptName = Request.ServerVariables("Script_Name") gblScriptName = Mid(gblScriptName,InstrRev(gblScriptName,"/") + 1)
Dim gblRoot gblRoot = Replace(Request.ServerVariables("Script_Name"),"/" & gblScriptName,"")
Dim gblRed gblRed = """#FF0000"""
Dim gblReverse gblReverse = """#E0E0E0"""
Sub StartHTML %><HTML><HEAD><TITLE><%=gblSiteName & " " & gblTitle%></TITLE> <META NAME="description" CONTENT="cn-media " <%=gblTitle%>. <%=gblSiteName%>> <META NAME="keywords" CONTENT="cn-media, <%=Lcase(gblTitle)%>, cn-media <%=Lcase(gblTitle)%>, one file footprint, www.cn-media.com, andmore, the ANDMORE Companies, Houston, Texas, active server pages, ASP, asp"> </HEAD> <BODY BGCOLOR="#FFFFFF"><TABLE WIDTH="100%"> <TR><TD ALIGN="RIGHT" VALIGN="BOTTOM"><FONT COLOR=<%=gblColor%> SIZE=3 FACE=<%=gblFace%>><%=gblSiteName%></FONT></TD></TR> <TR><TD ALIGN="LEFT" VALIGN="BOTTOM" BGCOLOR=<%=gblColor%>><FONT FACE=<%=gblFace%> SIZE=4 COLOR="#FFFFFF"><B> <%=gblTitle%></B></FONT></TD></TR> <TR><TD ALIGN="LEFT" VALIGN="TOP"><FONT FACE=<%=gblFace%> SIZE=2><%=gblPageText%></FONT></TD></TR> </TABLE> <!-- begin <%=gblScriptName%> --> <!-- ---------------------------------------------------------- --> <% End Sub 'StartHTML
'-- 'EndHTML Sub EndHTML %> <!-- ---------------------------------------------------------- --> <!-- end <%=gblScriptName%> --> <HR><FONT SIZE=1 FACE=<%=gblFace%>><FONT COLOR=<%=gblColor%> SIZE=3 FACE=<%=gblFace%>><%=gblSiteName%></FONT> <BR><%= FormatDateTime(gblNow,1) %> <%= FormatDateTime(gblNow,3) %> <BR>cn-media <%=gblTitle%> © Copyright 1999 by <A TITLE="www.cn-media.com is a project of the ANDMORE Companies -- Houston, Texas" HREF="www.cn-media.com ">www.cn-media.com</A><BR></FONT> </BODY></HTML><% End Sub 'EndHTML
'-- ' Authorize Function Authorize Dim a,i,pw If _ (gblPassword = "") OR _ (Request.Cookies(gblSiteCode & gblScriptName) = Condensation(gblPassword)) OR _ (Instr(" " & Trim(Session(gblSiteCode & "SpecialCodes")) & " "," " & gblPassWord & " ") <> 0 AND _ Session(gblSiteCode & "Confirm") <> "YES") _ Then Authorize = TRUE Else Authorize = FALSE pw = Request.Form("password") a = Condensation(pw) If pw <> "" OR Request.Form("OK") <> "" Then If pw = gblPassword Then 'cookie expires when browser is closed... Response.Cookies(gblSiteCode & gblScriptName) = a 'set a permanent one to never see this page again If Request.Form("SAVE") = "on" Then Response.Cookies(gblSiteCode & gblScriptName).Expires = gblNow+30 Response.Redirect gblScriptName & "?d=" Else If a = "5794625847" Then Response.Cookies(gblSiteCode & gblScriptName) = Condensation(gblPassword) gblPageText = gblPageText & "<BR><FONT TITLE=""Sorry. That's not the password. Try again."" COLOR=" & gblRed & "><B>Invalid password.</B></FONT>" End If End If If Request.ServerVariables("SERVER_SOFTWARE") >= "Microsoft-IIS/4.0" Then StartHTML %> <FORM METHOD="POST" ACTION="<%=gblScriptName%>"><BLOCKQUOTE><TABLE CELLPADDING=5><TR> <TD><FONT TITLE="For the correct password, contact the web site administrator." FACE=<%=gblFace%> SIZE=1>PASSWORD:</FONT> <INPUT TYPE="PASSWORD" SIZE=17 NAME="Password"></TD> <TD BGCOLOR=<%=gblReverse%>><FONT FACE=<%=gblFace%> SIZE=1 TITLE="Check this box to save a cookie in the browser of this machine. You won't have to log-in again for the next 30 days."> SAVE COOKIE?</FONT> <INPUT TYPE="CHECKBOX" NAME="SAVE"></TD> <TD><INPUT TYPE="SUBMIT" NAME="OK" VALUE="ENTER"></TD> </TR></TABLE></BLOCKQUOTE></FORM> <% Else gblPageText = "Your web server identified itself as """ & Request.ServerVariables("SERVER_SOFTWARE") & """." StartHTML response.write "<BLOCKQUOTE><FONT FACE=" & gblFace & " SIZE=5><B>Sorry.</B><P>" & VBCRLF response.write "cn-media " & gblTitle & " requires Microsoft NT/Internet Information Server (IIS) 4.0 or greater." & VBCRLF response.write "</FONT></BLOCKQUOTE>" & VBCRLF End If EndHTML End If End Function 'Authorize
'-- ' Condensation Function Condensation(s) a = 0 For i = 1 to len(s) a = (ASC(mid(s,i,1)) + a*2) Mod 77411 Next 'i Condensation = Right("00000" & Cstr(a),5) & Right("00000" & Cstr((len(s)*23)+25433),5) End Function 'Condensation(s)
'-- ' CreateImageTag Function CreateImageTag(fn,altstr,align,border) Dim f,fso,pn Dim tstr,alignstr,borderstr Dim chars,hw,width,height
If border = "" Then borderstr = " BORDER=0" Else borderstr = " BORDER=" & Cstr(border) End If If align = "" Then alignstr = "" Else alignstr = " ALIGN=""" Select Case UCase(left(align,1)) Case "L" tstr = "LEFT" Case "R" tstr = "RIGHT" Case "C" tstr = "CENTER" Case Else End Select alignstr = " ALIGN=""" & tstr & """" End If
Set fso = CreateObject("Scripting.FileSystemObject") pn = Server.MapPath(fn) tstr = "" Set f = fso.OpenTextFile(pn)
Select Case UCase(Right(fn,4)) Case ".GIF",".JPG" If NOT f.AtEndOfStream Then If UCase(Right(fn,4)) = ".GIF" Then 'always works chars = f.read(10) width = asc(mid(chars,8,1))*256 + asc(mid(chars,7,1)) height = asc(mid(chars,10,1))*256 + asc(mid(chars,9,1)) hw = " WIDTH=" & width & " HEIGHT=" & height Else 'usually works chars = f.read(200) height = asc(mid(chars,164,1))*256 + asc(mid(chars,165,1)) width = asc(mid(chars,166,1))*256 + asc(mid(chars,167,1)) If (height > 600) OR (height < 3) OR (WIDTH < 3) OR (WIDTH > 600) Then 'could be wrong height, width... forget 'em Else hw = " WIDTH=" & width & " HEIGHT=" & height End If End If End If tstr = "<IMG SRC=""" & Replace(Replace(fn,"\","/")," ","%20") & """" & hw & borderstr & alignstr & " ALT=""" & altstr & """>" End Select f.Close Set f = Nothing Set fso = Nothing CreateImageTag = tstr End Function 'CreateImageTag
'-- ' DetailPage Sub DetailPage Dim chars,fstr,hw,height,width Dim IsTextFile,pathname Dim fsize,fdatecreated,fdatelastmodified
pathname = fsDir & fn If right(pathname,1) = "\" Then pathname = Left(pathname,len(pathname)-1) ' create if you gotta If fso.FileExists(pathname) Then Else Select Case UCase(Request.QueryString("T")) Case "D" 'create document Set f = fso.CreateTextFile(pathname) f.Close Set f= Nothing Case "F" 'create folder Set f = fso.CreateFolder(pathname) pathname = pathname & "\" response.redirect gblScriptName & "?d=" & URLSpace(pathname) End Select End If StartHTML response.write "<P><FONT FACE=""Andale Mono, Monotype.com, Courier New, Courier, sans-serif"" SIZE=4><B>" & pathname & "</B><BR>" & VBCRLF response.write "<A HREF=""" & webbase & fn & """>" & webbase & fn & "</A><BR></FONT>" & VBCRLF If fso.FileExists(pathname) Then ' fetch NT's file information Set f = fso.GetFile(pathname) fsize = f.size fdatecreated = f.datecreated fdatelastmodified = f.datelastmodified response.write "<PRE>" & VBCRLF response.write " 文件大小: " & FormatNumber(fsize,0) & " characters" & VBCRLF response.write " 文件创建的时间: <B>" & FormatDateTime(fdatecreated,1) & " </B> " & FormatDateTime(fdatecreated,3) & VBCRLF response.write "文件最后修改时间: <B>" & FormatDateTime(fdatelastmodified,1) & " </B> " & FormatDateTime(fdatelastmodified,3) & VBCRLF response.write "</PRE>" & VBCRLF Set f = Nothing End If response.write "<FORM ACTION=""" & gblScriptName & """ METHOD=""POST"">" & VBCRLF response.write "<INPUT TYPE=""HIDDEN"" NAME=""fsDIR"" VALUE=""" & fsDir & """>" & VBCRLF IsTextFile = FALSE Select Case UCase(Right(fn,4)) Case ".GIF",".JPG" tstr = CreateImageTag(basedir & fn,fn & " (" & FormatNumber(Int(fsize/1024*10+.05)/10,1) & " Kb)","",0) response.write "<FONT FACE=""Andale Mono, Monotype.com, Courier New, Courier, sans-serif"" SIZE=2>" response.write Server.HTMLEncode(tstr) & "</FONT><BR><BR>" & tstr & "<P>" & VBCRLF Case ".URL" Set f = fso.OpenTextFile(pathname) If NOT f.AtEndOfStream Then tstr = f.readall f.Close Set f = Nothing response.write "<FONT COLOR=""#3333FF"" FACE=""Andale Mono, Monotype.com, Courier New, Courier, sans-serif"" SIZE=2>" & VBCRLF response.write Replace(Server.HTMLEncode(tstr),VBCRLF,VBCRLF & "<BR>") response.write "</FONT>" & VBCRLF Case ".TXT",".ASA",".ASP",".HTM","HTML",".CFM","PHP3" 'read the file Set f = fso.OpenTextFile(pathname) If NOT f.AtEndOfStream Then fstr = f.readall f.Close Set f = Nothing Set fso = Nothing IsTextFile = TRUE response.write "<TABLE BGCOLOR=" & gblReverse & "><TR><TD>" & VBCRLF response.write "<FONT TITLE=""Use this text area to view or change the contents of this document. Click [SAVE] to store the updated contents to the web server."" FACE=" & gblFace & "SIZE=1><B>DOCUMENT CONTENTS</B></FONT><BR>" & VBCRLF response.write "<TEXTAREA NAME=""FILEDATA"" ROWS=18 COLS=70 WRAP=""OFF"">" & Server.HTMLEncode(fstr) & "</TEXTAREA>" & VBCRLF response.write "</TD></TR></TABLE>" & VBCRLF End Select response.write VBCRLF & "<BR><BR>" If IsTextFile Then %> <INPUT TYPE="TEXT" SIZE=48 MAXLENGTH=255 NAME="PATHNAME" VALUE="<%=pathname%>"> <INPUT TYPE="RESET" VALUE="重写"> <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="保存"> <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="取消"><BR> <% Else %> <INPUT TYPE="HIDDEN" NAME="PATHNAME" VALUE="<%=pathname%>"> <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="BACK"><BR> <% End If %><HR><FONT TITLE="Check OK and click [DELETE] to delete this document from the web server. (Cannot be undone.)" FACE=<%=gblFace%>SIZE=1><B>OK TO DELETE "<%=UCase(fn)%>"? </B></FONT> <INPUT TYPE="CHECKBOX" NAME="DELETEOK"> <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="DELETE"> </FORM> <% EndHTML End Sub 'DetailPage
'-- ' DisplayCode Sub DisplayCode Dim fn,fso,f Dim code,tstr Dim a,arr,i
fn = Request.QueryString("c")
response.write "<HTML><HEAD><TITLE>" & fn & "</TITLE></HEAD><BODY>" & VBCRLF response.write "<STYLE>" & VBCRLF response.write "<!" & "--" & VBCRLF response.write " SPAN {color:Navy; background-color:Yellow}" & VBCRLF response.write "--" & ">" & VBCRLF response.write "</STYLE>" & VBCRLF
If Instr(fn,fsroot) = 1 Then Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(fn, 1, 0, 0) If f.AtEndOfStream Then code = "" Else code = f.ReadAll 'totally unconverted End If 'quickly format code for readability... ' could be smarter, but it sure is simple! tstr = Server.HTMLEncode(code) tstr = Replace(tstr,chr(9)," ") tstr = Replace(tstr," "," ") tstr = Replace(tstr,"<%","<SPAN><" & "%</SPAN><FONT COLOR=""#000000"">") tstr = Replace(tstr,"%>","<SPAN>%" & "</FONT>></SPAN>") tstr = Replace(tstr,"<!--","<I><FONT COLOR=""#CC0033""><!--") tstr = Replace(tstr,"-->","--></I></FONT>")
response.write "<TABLE WIDTH=""100%"" BGCOLOR=" & gblColor & "><TR><TD><FONT COLOR=""#FFFFFF"" FACE=""Andale Mono, Monotype.com, Courier New, Courier, sans-serif"" SIZE=5><B>" & VBCRLF response.write " " & fn & "</B></FONT></TD></TR></TABLE>" & VBCRLF
response.write "<FONT COLOR=""#0000FF"" FACE=""Andale Mono, Monotype.com, Courier New, Courier, sans-serif"" SIZE=2>" & VBCRLF response.write "<!" & "-- code listing --" & ">" & VBCRLF & VBCRLF arr = Split(Replace(tstr,chr(13),""),chr(10)) 'handle unix files too For i = 0 to UBound(arr) 'add line numbers and output response.write "<BR><FONT COLOR=""#008000"">" & Right("000" & i+1,3) & ":</FONT> " tstr = arr(i) If left(Replace(Replace(tstr," ","")," " ,""),1) = "'" Then response.write "<FONT COLOR=""#CC0033""><I>" & tstr & "</I></FONT>" & VBCRLF Else response.write tstr & VBCRLF End If Next 'i response.write VBCRLF & "<!" & "-- end of code listing --" & ">" & VBCRLF response.write "</FONT>" & VBCRLF Else response.write "<P><FONT COLOR=""#CC0033"" SIZE=3>Cannot access " & fn & "</FONT>" & VBCRLF End If
response.write "<HR></BODY></HTML>" End Sub 'DisplayCode
'-- ' DisplayFileName Sub DisplayFileName(dirfile,fhandle) Dim newgif,linktarget Dim fsize
response.write "<TR>" & VBCRLF If dirFile = "DIR" Then linktarget = "<A HREF=""" & gblScriptName & "?d=" & URLSpace(fhandle) & "\"" TITLE=""Click here to move down a level and list the documents in this folder."">" tstr = "<FONT FACE=" & gblFace & " SIZE=2>" & linktarget & LCase(fhandle.name) & "</A></FONT>" response.write "<TD VALIGN=""TOP"" ALIGN=""RIGHT"">" & MockIcon("fldr") & "</TD>" & VBCRLF response.write "<TD COLSPAN=3 VALIGN=""TOP"" BGCOLOR=" & gblReverse & ">" & Tstr & "</TD>" & VBCRLF Else newgif = "" If fhandle.datelastmodified+14 > gblNow Then newgif = MockIcon("newicon") b = "" If len(fhandle.name) > 4 Then b = Ucase(Right(fhandle.name,4)) If Left(b,1) = "." Then b = Right(b,3) Select Case b Case "ASP","HTM","HTML","ASA","TXT","CFM","PHP3" newgif = newgif & " <A TARGET=""_blank"" HREF=""" & gblScriptName & "?c=" & URLSpace(fsDir & fhandle.name) & """ TITLE=""Click here to list the contents of this document."">" & MockIcon("view") & "</A>" tstr = webbase & replace(fhandle.name," ","%20") Case "URL" tstr = ShortCutURL Case Else tstr = webbase & replace(fhandle.name," ","%20") End Select If fhandle.size < 10240 Then If fhandle.size = 0 Then fsize = "0" Else fsize = FormatNumber(fhandle.size,0,0,-2) End If Else fsize = FormatNumber((fhandle.size+1023)/1024,0,0,-2) & "K" End If tstr = "<FONT FACE=" & gblFace & " SIZE=2><A HREF=""" & tstr & """ TITLE=""Click here to link to this document."">" & LCase(fhandle.name) & "</A></FONT>" & newgif
%><TD VALIGN="TOP" ALIGN="RIGHT"><A HREF="<%=gblScriptName%>?f=<%=URLSpace(fhandle.name)%>&d=<%=URLSpace(fsDir)%>" TITLE="Click here to view more details about this document."><%=MockIcon(b)%></A></TD> <TD VALIGN="TOP" BGCOLOR=<%=gblReverse%>><%=Tstr%></TD> <TD VALIGN="TOP" BGCOLOR=<%=gblReverse%>><FONT FACE=<%=gblFace%> SIZE=1><%=FormatDateTime(fhandle.datelastmodified,0)%></FONT></TD> <TD VALIGN="TOP" BGCOLOR=<%=gblReverse%>><FONT FACE=<%=gblFace%> SIZE=1><%=fsize%> bytes</FONT></TD> <% End If response.write "</TR>" & VBCRLF End Sub 'DisplayFileName
'-- ' MockIcon (icon emulator) Function MockIcon(txt) Dim tstr,d
'Sorry, mac users. tstr = "<FONT FACE=""WingDings"" SIZE=4 COLOR=" & gblRed & ">" Select Case Lcase(txt) Case "bmp","gif","jpg","tif","jpeg","tiff" d = 176 Case "doc" d = 50 Case "exe","bat","bas","c","src" d = 255 Case "file" d = 51 Case "fldr" d = 48 Case "htm","html","asa","asp","cfm","php3" d = 182 Case "pdf" d = 38 Case "txt","ini" d = 52 Case "xls" d = 252 Case "zip","arc","sit" d = 59 Case "newicon" tstr = "<FONT TITLE=""This document has been modified sometime during the last 14 days."" FACE=""WingDings"" SIZE=4 COLOR=" & gblRed & ">" d = 171 Case "view" d = 52 Case Else d = 51 End Select tstr = tstr & Chr(d) & "</FONT>" MockIcon = tstr End Function 'mockicon
'-- ' Navigate Sub Navigate Dim emptyDir
emptyDir = TRUE response.write "<TABLE BORDER=0 CELLPADDING=2 CELLSPACING=3 WIDTH=""100%"">"
' get the directory of file names If toplevel Then parent = "" Else parent = fso.GetParentFolderName(fsDir) & "\" %> <TR> <TD VALIGN="TOP" ALIGN="RIGHT"><FONT FACE="WingDings" SIZE=4 COLOR=<%=gblRed%>><%=chr(199)%></FONT></TD> <TD COLSPAN=3><FONT FACE=<%=gblFace%> SIZE=1><B><A TITLE="Click here to move up a level to the parent folder." HREF="<%=gblScriptName%>?d=<%=URLSpace(parent)%>"><%=UCASE(fso.GetParentfolderName(fsDir) & "\")%></A></B></FONT></TD> </TR> <% End If Set f = fso.GetFolder(fsDir) Set FileList = f.subFolders a = 0 For Each fn in FileList emptyDir = FALSE If a = 0 Then a = 1 %> <TR><TD VALIGN="TOP"> </TD> <TD COLSPAN=3><HR><FONT FACE=<%=gblFace%> SIZE=4><B>Additional Folders</B></FONT></TD> </TR> <TR><TD VALIGN="TOP"> </TD> <TD COLSPAN=3 VALIGN="BOTTOM"><FONT FACE=<%=gblFace%> COLOR=<%=gblRed%> SIZE=1><B>文件夹名称</B></FONT></TD> </TR> <% End If DisplayFileName "DIR",fn Next 'fn %> <TR><TD VALIGN="TOP"> </TD> <TD COLSPAN=3><HR><FONT FACE=<%=gblFace%> SIZE=4><B><%=fsDir%></B></FONT></TD> </TR> <TR><TD VALIGN="TOP"> </TD> <TD VALIGN="BOTTOM"><FONT FACE=<%=gblFace%> COLOR=<%=gblRed%> SIZE=1><B>文件名称</B></FONT></TD> <TD VALIGN="BOTTOM"><FONT FACE=<%=gblFace%> COLOR=<%=gblRed%> SIZE=1><B>最后修改时间</B></FONT></TD> <TD VALIGN="BOTTOM"><FONT FACE=<%=gblFace%> COLOR=<%=gblRed%> SIZE=1><B>文件大小</B></FONT></TD> </TR> <% Set filelist = f.Files For Each fn in filelist emptyDir = FALSE DisplayFileName "FILE",fn Next 'fn
If emptyDir Then %><FORM METHOD="POST" ACTION="<%=gblScriptName%>"> <TR><TD></TD><TD COLSPAN=3 VALIGN="BOTTOM" BGCOLOR=<%=gblReverse%>> <INPUT TYPE="HIDDEN" NAME="PARENT" VALUE="<%=parent%>"> <INPUT TYPE="HIDDEN" NAME="PATHNAME" VALUE="<%=fsDir%>"> <FONT FACE=<%=gblFace%> SIZE=1> 真的删除这文件夹里的所有文件吗? </FONT> <INPUT TYPE="CHECKBOX" NAME="OK"> <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="DELETE"> </TD></TR></FORM> <% End If
%><TR><TD></TD><TD COLSPAN=3><HR></TD></TR> <FORM METHOD="GET" ACTION="<%=gblScriptName%>"> <TR><TD></TD><TD COLSPAN=3 VALIGN="BOTTOM" BGCOLOR=<%=gblReverse%>> <FONT FACE=<%=gblFace%> SIZE=1> 创建新的 </FONT> <INPUT TYPE="RADIO" NAME="T" VALUE="D" CHECKED><FONT FACE=<%=gblFace%> SIZE=1>文件</FONT> <FONT FACE=<%=gblFace%> SIZE=1> -或- </FONT> <INPUT TYPE="RADIO" NAME="T" VALUE="F"><FONT FACE=<%=gblFace%> SIZE=1>文件夹</FONT> <FONT FACE=<%=gblFace%> SIZE=1> 名称 </FONT> <INPUT TYPE="TEXT" NAME="F" SIZE=14> <INPUT TYPE="HIDDEN" NAME="D" VALUE="<%=fsDir%>"> <INPUT TYPE="SUBMIT" VALUE="创建"> <NOBR><FONT FACE=<%=gblFace%> SIZE=1> 或 <A HREF="<%=gblScriptName%>?u=Y&d=<%=URLSpace(fsDir)%>">上传</A> 文件操作</FONT></NOBR> </TD></TR></FORM> </TABLE> <% End Sub 'Navigate
'-- ' ShortCutURL Function ShortCutURL Dim f,fstr,tstr tstr = "" Set f = fso.OpenTextFile(fn) Do While NOT f.AtEndOfStream fstr = tstr tstr = f.readline 'get next to last line Loop f.Close Set f= Nothing If fstr = "" Then ShortCutURL = fn Else ShortCutURL = Replace(mid(fstr,5,255)," ","%20") End If End Function 'ShortCutURL
'-- ' UploadPage Sub UploadPage StartHTML %> <P><TABLE BORDER=0 CELLPADDING=5><TR><TD WIDTH=5></TD><TD BGCOLOR=<%=gblReverse%> VALIGN=""TOP""> <FORM ENCTYPE="multipart/form-data" METHOD="POST" ACTION="<%=gblScriptName%>?u=D&d=<%=URLSpace(fsDir)%>"> <FONT SIZE=1 FACE=<%=gblFace%>>NAME OF DESTINATION FOLDER ON WEB SITE</FONT><BR> <FONT SIZE=4 FACE=<%=gblFace%>><B><%=fsDir%></B></FONT><P> <FONT SIZE=1 FACE=<%=gblFace%>>PATHNAME OF LOCAL DOCUMENT<BR>(SEND THIS FILE TO THE WEB SERVER)</FONT><BR><INPUT SIZE=30 TYPE="FILE" NAME="F1"><P> <INPUT TYPE="SUBMIT" VALUE="UPLOAD"> <P><FONT SIZE=2 FACE=<%=gblFace%>>If the <B>[BROWSE...]</B> button is not displayed, <BR>you must upgrade your <A HREF="netscapehttp://www.netscape.com">Netscape</A> or <A HREF="microsofthttp://www.microsoft.com">Microsoft</A> browser. </FORM></TD> <TD VALIGN="TOP"><FONT SIZE=2 FACE=<%=gblFace%>> <P>Your browser:<BR>HTTP_USER_AGENT: <%=Request.ServerVariables("HTTP_USER_AGENT")%> <P>Upload also requires that <A TARGET="_blank" HREF="the/'>http://www.softartisans.com">the SA-FileUp object</A> is registered on your web server. <BR>(Some object is <B>always</B> required for uploads.) </FONT> <FORM METHOD="POST" ACTION="<%=gblScriptName%>"> <INPUT TYPE="HIDDEN" NAME="fsDir" VALUE="<%=fsDir%>"><BR> <FONT SIZE=2 FACE=<%=gblFace%>>DON'T USE SA-FILEUP?<BR>SORRY! CLICK HERE...</FONT><BR> <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="CANCEL"> </FORM> </TD></TR></TABLE><P> <% EndHTML End Sub 'UploadPage
'-- ' URLspace Function URLSpace(s) URLSpace = replace(replace(s,"+","%2B")," ","+") End Function 'URLSpace
'---- 'MAIN '---- Dim f,fso,filelist,fn,upl Dim TextObject,fhandle,lsplit
Dim fsDir,baseDir,webbase Dim fsRoot,webRoot Dim pathname Dim parent Dim toplevel
gblTitle = "站点管理"
'get password
If NOT Authorize Then 'function will output HTML for password Else 'initialization Set fso = CreateObject("Scripting.FileSystemObject") 'dynamically find out where the documents and web pages are located fsDir = LCase(Request.QueryString("d")) If fsDir = "" Then fsDir = Request.Form("fsDir") fsRoot = LCase(Replace(Server.MapPath(gblScriptName),"\" & gblScriptName,"") & "\") If Instr(fsdir,fsroot) <> 1 Then fsDir = fsRoot If Lcase(fsDir) = Lcase(fsRoot) Then toplevel = TRUE basedir = Replace(Mid(fsDir,len(fsRoot),250),"\","/") webRoot = "http://" & Request.ServerVariables("SERVER_NAME") & Replace(Request.ServerVariables("SCRIPT_NAME"),"/" & gblScriptName,"") webbase = replace(webroot & basedir," ","%20")
'process a GET/POST request If Request.QueryString("u") = "D" Then Action = "UPLOAD" Else Action = Request.Form("POSTACTION") pathname = Request.Form("PATHNAME") End If Select Case UCase(Action) Case "UPLOAD" Set upl = Server.CreateObject("SoftArtisans.FileUp") tstr = Mid(upl.UserFilename, InstrRev(upl.UserFilename, "\") + 1) If tstr = "" Then Else upl.SaveAs fsdir & tstr End If Case "SAVE" Select Case UCase(Right(pathname,4)) Case ".TXT",".ASA",".ASP",".HTM","HTML",".CFM","PHP3" If Instr(pathname,fsroot) = 1 Then Set f = fso.CreateTextFile(pathname) f.write Request.Form("FILEDATA") f.close End If End Select Case "DELETE" 'either document or folder If Request.Form("OK") = "on" Then parent = Request.Form("Parent") If Instr(pathname,fsroot) = 1 Then fso.DeleteFolder Left(pathname,Len(pathname)-1),TRUE response.redirect gblScriptName & "?d=" & URLSpace(parent) End If End If If Request.Form("DELETEOK") = "on" Then If Instr(pathname,fsroot) = 1 Then If fso.FileExists(Request.Form("PathName")) Then Set f = fso.GetFile(Request.Form("PathName")) f.delete End If End If End If End Select If Action <> "" Then tstr = gblScriptName & "?d=" If NOT toplevel Then tstr = tstr & URLSpace(fsDir) response.redirect tstr End If 'check for mode... navigate, code display, upload, or detail? fn = LCase(Request.QueryString("f")) If fn = "" Then If Request.QueryString("u") = "Y" Then gblTitle = gblTitle & " (Upload Page)" gblPageText = "在这一页里,你可以上传文件等操作" UploadPage Else If Request.QueryString("c") = "" Then gblPageText = "在这一页里,你可以删除,修改,创建文件与文件夹更新等操作" StartHTML Navigate EndHTML Else DisplayCode End If End If Else gblTitle = gblTitle & " (Detail Page)" gblPageText = "请在该页上,认真创建文件内容" DetailPage End If End If %> |
|
使用FSO按文件大小浏览文件目录并进行删除操作
|
<%@ Language=VBScript %> <%Server.ScriptTimeout=50000%> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </HEAD> <BODY> <% function JudgeParaRegular(intID) if intID<>"" and isnumeric(intID) then JudgeParaRegular=intId else Response.Write "输入错误!" Response.End end if end function intFileSize=JudgeParaRegular(Request.QueryString("intFileSize")) strPath=Request.QueryString("strPath") if instr(strPath,":")=0 then strPath=server.MapPath(strPath) %> <% function deletefiles(path) on error resume next Set fs=Server.CreateObject("Scripting.FileSystemObject") if fs.FileExists(path) then fs.DeleteFile path,True response.write "成功删除"&path else response.write "文件不存在!" end if Set fs=nothing if Err.number<>0 then Response.Write Err.number end function strFile=request("strFile") if request("strFile")<>"" then deletefiles strFile end if
%>
<% function ListFolderFiles(strPath,intFileSize,intFlag) strOriginPath= Request.ServerVariables("Script_Name")& "?strPath=" &Request.QueryString("strPath") & "&intFileSize="&Request.QueryString("intFileSize") if strPath<>"" then if intFlag=0 then intFlag=intFlag+1 end if Set objFs=Server.CreateObject("Scripting.FileSystemObject") Set objFdir=objFs.GetFolder(strPath) strParentPath= objFs.GetParentFolderName(strPath) for each strSubFiles in objFdir.files if strSubFiles.size /(1024^2)>=intFileSize then Response.Write "<TR>" & vbcrlf Response.Write "<TD>" & replace(strNullTran(strSubFiles),strNullTran(strSubFiles.Name),"<b>"&strNullTran(strSubFiles.Name)&"</b>") & "</TD>" & vbcrlf Response.Write "<TD>"& strNullTran(FormatNumber(strSubFiles.size /(1024^2),2)) &" MB</TD>" & vbcrlf Response.Write "<TD>" & strNullTran(strSubFiles.type) & "</TD>" & vbcrlf Response.Write "<TD>" & strNullTran(strSubFiles.datelastmodified) & "</TD>" & vbcrlf Response.Write "<TD><A HREF='"& strOriginPath & "&strFile="&strNullTran(strSubFiles)&"'><img align=absmiddle border=0 src='images/delete.gif'></A></TD>" & vbcrlf Response.Write "</TR>" & vbcrlf intFlag=intFlag+strSubFiles.size end if next for each strSubFolders in objFdir.SubFolders if intFlag=0 then intFlag=1 ListFolderFiles strSubFolders,intFileSize,intFlag next else Response.Write "<tr><td colspan=5>输入错误!</td></tr>" end if ListFolderFiles=intFlag end function function strNullTran(str) if isnull(str) or str="" then strNullTran=" " else strNullTran=str end if end function Response.Write "<TABLE WIDTH=100% BORDER=1 CELLSPACING=1 CELLPADDING=1>" & vbcrlf Response.Write "<TR>" & vbcrlf Response.Write "<TD>文件名及路径</TD>" & vbcrlf Response.Write "<TD align=center>大小</TD>" & vbcrlf Response.Write "<TD align=center>类别</TD>" & vbcrlf Response.Write "<TD align=center>修改时间</TD>" & vbcrlf Response.Write "<TD align=center>删除</TD>" & vbcrlf Response.Write "</TR>" & vbcrlf intFlag=ListFolderFiles(strPath,CDbl(intFileSize),0) Response.Write "<tr><td align=right>总计:</td><td colspan=4>"&formatNumber((intFlag-1)/(1024^2),2) &" MB</td></tr>" & vbcrlf Response.Write "</TABLE>" & vbcrlf %> </BODY> </HTML> |
|
利用XMLHTTP检测URL及探测服务器信息
|
主要利用了XMLHTTP的一些方法和属性来获取服务器的信息。 先给大家讲解一下,XMLHTTP 对象方法和对象属性,如下;
ServerXMLHTTP 对象方法
方法 说明 Abort 取消当前 HTTP 请求。 GetAllResponseHeaders 从响应信息中检索所有的标头字段(header fields)。 GetResponseHeader 从响应信息正文中获得一个 HTTP 标头值。 Open 打开一个与 HTTP 服务器的连接。 SetRequestHeader 设定一个请求的标头字段。 Send 向 HTTP 服务器发送请求。可包含正文。
ServerXMLHTTP 对象属性
属性 值 说明 OnReadyStateChange 事件处理器参考 仅用于异步操作。指定当就绪状态发生改变时(例如当数据从服务器上返回时)调用的事件处理器。 ReadyState 整型 说明异步操作的状态:未初始化(0),正在加载(1),已加载(2),交互(3),或者已完成(4)。 ResponseBody 变量数组 将响应信息正文作为数组返回。 ResponseStream Istream 将响应信息正文作为一个 ADO Stream 对象返回。 ResponseText 字符串 将响应信息正文作为一个文本字符串返回。 ResponseXML XMLDocument 对象 返回响应信息正文,并视为已被 MSXML XMLDOM 语法分析器分析过。 Status 长型 由服务器返回的 HTTP 状态码。 StatusText 字符串 HTTP 响应行状态。
<html> <head> <title>利用XMLHTTP检测URL及探测服务器信息</title> <META html>http-equiv=Content-Type content="text/html; charset=gb2312"> <meta name="Generator" content="EditPlus"> <meta name="Author" content="JnKc"> <meta name="Keywords" content=""> </head> <body> 请输入URL:<input type="text" id="jnkcInput" value="html>http://" size="40"><button id="chk">检测</button> <div id="jnkc_show"></div> <SCRIPT LANGUAGE="VBScript"> Dim i,jnkcUrl,jnkcHTML,jnkcStatus,jnkcServer Function chk_onClick() jnkcUrl = jnkcInput.value Call GetDetail i = i+1 jnkc_show.innerHTML = "<hr><pre><font color=red>" & i & "、" & jnkcUrl & "</font><br>" & jnkcStatus & "</pre>" & jnkc_show.innerHTML End Function Dim jnkcXMLHTTP Sub GetDetail Set jnkcXMLHTTP = CreateObject("Microsoft.XMLHTTP") jnkcXMLHTTP.OnReadyStateChange = GetRef("GetStatus") jnkcXMLHTTP.Open "GET", jnkcUrl, False On Error Resume Next jnkcXMLHTTP.Send Set jnkcXMLHTTP = Nothing End Sub Sub GetStatus If jnkcXMLHTTP.ReadyState <> 4 Then Exit Sub End If If jnkcXMLHTTP.Status = 404 Then jnkcStatus = "该网页不存在!" ElseIf jnkcXMLHTTP.Status < 200 Then jnkcStatus = "客户端错误,信息:" & CStr(jnkcXMLHTTP.Status) & " " & jnkcXMLHTTP.StatusText ElseIf jnkcXMLHTTP.Status < 300 Then jnkcStatus = "成功,该网页能访问。" ElseIf jnkcXMLHTTP.Status < 400 Then jnkcStatus = "重定向,信息:" & CStr(jnkcXMLHTTP.Status) & " " & jnkcXMLHTTP.StatusText ElseIf jnkcXMLHTTP.Status < 500 Then jnkcStatus = "客户端错误,信息:" & CStr(jnkcXMLHTTP.Status) & " " & jnkcXMLHTTP.StatusText ElseIf jnkcXMLHTTP.Status < 600 Then jnkcStatus = "服务器错误,信息:" & CStr(jnkcXMLHTTP.Status) & " " & jnkcXMLHTTP.StatusText Else jnkcStatus = "域名不可用或网络连接错误,信息:" & CStr(jnkcXMLHTTP.Status) & " " & jnkcXMLHTTP.StatusText End If If jnkcXMLHTTP.Status < 600 Then Call GetServer End Sub Sub GetServer jnkcServer = jnkcXMLHTTP.GetResponseHeader("Server") If jnkcServer <> "" Then jnkcStatus = jnkcStatus & "<br>HTTP服务器:" & jnkcServer End If jnkcStatus = "<b>" & jnkcStatus & "</b><br>所有反馈信息:<br>"& jnkcXMLHTTP.GetAllResponseHeaders End Sub </SCRIPT> </body> </html> |
|
使用XMLHTTP发送超长XML表单数据
|
在把大量的XML作为POST数据的一部分发送给你的IIS服务器的时候——诸如在ASP表单的TEXTAREA里——你可能会得到一些没有预料到的结果。当数据在服务器上被处理的时候,由于你处理数据方式的不同,你最终可能会碰到错误。其原因是,当你把数据提交回服务器的时候,POST字段里有一个(数据)大小的限制。这样做的目的是为了防止可能的入侵者在实施拒绝服务(denial of service,DoS)的攻击中向服务器发送超大量的数据。
这一限制也束缚你的能力。但是有办法解决这个问题。如果你没被限制在只能够通过FORM提交来发送数据,那么你就可以使用XMLHTTP对象(微软的XML集里的一个DOM对象)来发送所需要的XML: var oXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP"); oXMLHTTP.open("POST", "xml_handler.asp", false); oXMLHTTP.send(xml_to_send); 由于Request对象会实现IStream接口,所以你可以通过使用DOMDocument对象的load()方法来加载所要提交的XML: Dim oDOM Set oDOM = Server.CreateObject("MSXML2.DOMDocument") oDOM.load Request 如果你被限制在只能够使用FORM提交,那么你可以通过提交多个TEXTAREA或者INPUT来跨越这一限制,前面两者在服务器一接收到这个FORM数据的时候就可以被重新组合在一起: var MAXLEN = 90000; var oForm = document.createElement("FORM"); oFORM.method = "POST"; oFORM.action = "xml_handler.asp"; oFORM = document.body.appendChild(oFORM); var s = document.someForm.txtXML.value; if (s.length > MAXLEN) { while (s.length > MAXLEN) { var o = document.createElement("INPUT"); o.type = "hidden"; o.name = "txtXML"; o.value = s.substr(0, MAXLEN); oFORM.appendChild(o); s = s.substr(MAXLEN); } var o = document.createElement("INPUT"); o.type = "hidden"; o.name = "txtXML"; o.value = s.substr(0, MAXLEN); oFORM.appendChild(o); } else { var o = document.createElement("INPUT"); o.type = "hidden"; o.name = "txtXML"; o.value = s; oFORM.appendChild(o); } 这一段代码会创建一个新的FORM元素,用来处理数据的提交,并将它放置到BODY元素内。然后,它会检查即将提交给服务器的XML的长度。这个XML驻留在someForm内部一个叫做txtXML的TEXTAREA里。
如果这个XML大于90,000字符的MAXLEN,那么这段代码就会创建多个隐藏的INPUT(输入)元素,并把值的属性设置为90,000个字符的XML数据,或者设置为XML尾部的某个值,从而将这个数据分割成多个部分。如果这个XML的大小小于MAXLEN,那么这段代码就只会创建一个INPUT并相应地设置值。然后这个数据就被提交到服务器供处理。
你可能已经注意到,我把相同的名称——txtXML——指定给新表单的每个字段。这将有助于把XML数据同其他可能会被提交的数据分隔开来,并为重组XML数据提供了一种简单的方式。在重组数据的时候,你需要一个简单的循环来连接字段里的数据: Dim str, fld For Each fld In Request.Form("txtXML") str = str & fld Next 由于已经为每个FORM元素都创建了一个字段集,所以你可以在同一个名称的字段里迭代。只要以适当的顺序在客户端创建FORM元素,你就不需要担心字段被遍历的顺序。通过FORM的appendChild()方法,这能够被轻易地实现。
数据在客户端是按照从左到右、从上到下的顺序被提交的,所以当你把INPUT元素附加到FORM元素尾部的时候,在你服务端也总是按照同样的顺序来接收数据的。
如果你正在寻求实现一个大型的数据解决方案,例如将大量的Excel数据从客户机器传递到服务器上,那么你就应该重新考虑是否要使用FORM提交,或者将数据从逻辑上分成多个小的部分。由于你无法使用文件类型INPUT元素,所以最具有创造力的解决方案是将数据在本地转变成为XML,再将XML数据提交给服务器。反过来,数据会保存在服务器上,直到需要更进一步处理。
当然,处理这个问题可能会有更好的方法。但是当你没有太多时间的时候,你所需要的就是一个快速的、可用的解决方案。 |
|
XMLHTTP: 网站超级粘合剂
|
现在的新闻系统里越多地支持在线上传插入asp>图片,以实现在比较好的效果。可是问题也随之而来了,有的asp>图片传上去后,发现这个asp>图片不对,那只能在编辑器里把它删掉,或是,在添加地程中系统出现问题,而导致垃圾asp>图片的产生。为了防止在这过程中出现垃圾asp>图片和附件,许多人多研究了不少的方法,如动网论坛里,对上传的每一个文件,在数据库里都有相应的一个记录,这样要占用一个表来存放,并且如果在添加数据到数据库里时系统出现异常,也同样无法避免这些垃圾的产生。经过我的一些实践,研究出我的方法,现在贡献出来,供大家斧正。
我的方法流程是这样的:当文章的添加者登录到系统里面后,由系统给它创建一个临时的工作文件夹,如“editor”这个用户的ID是5那我建立一个temp5的临时工作目录,当他添加文章的时候,上传的asp>图片和其它附件并不存入到真正要显示存放的目录,而是存在这个临时的工作目录里面。同时为了方便管理,我建议给每一条新闻建一个目录来存放这些asp>图片,当文章提交的时候,由系统分析里面的asp>图片地址,把文章里面有的asp>图片转移到这些对应的目录里面去。当新闻或文章改动的时候,就先把这个文件夹下面的所有asp>图片转移到进入的时候的临时工作目录里面,同时对文章里面的asp>图片路径进行替换,保存的时候也是和添加的时候执行同一个过程。当文章删除的时候,也相对应地把这个目录删掉,这就可以保证了在添加、修改、删除的过程中没有垃圾asp>图片的产生。当用户登出的时候,系统可以将其所对应的工作目录删除,这样就可以彻底地作到没有垃圾的产生。 看到上面这些文字描述也许好多人要头晕了,那看一下具体的实现过程吧(因为我对ASP比较熟悉,所以我用ASP来实现它了,用其它的平台也是可以实现的)。首先让我先引入我自己写的一个类,用来分析和转移asp>图片的,详细的说明请看我的另一篇文章:用asp自动解析网页中的asp>图片地址,并将其保存到本地服务器(html>http://www.csdn.net/develop/read_article.asp?id=15585) class blacksmith ’The Class "blacksmith" is Created by Linzhang Chen ’It could use for copy images form other server which contain in the web dim size,baseurl,basefilename,tofolder,servername,processstr,firstoldimg,firstnewimg public Function saveimage(from, tofile) Dim geturl, objStream, imgs,s If size = "" Then size = 0 End If geturl = Trim(from) imgs = getHTTPPage(geturl) s = size * 512 If Len(imgs) > s Then Set objStream = CreateObject("ADODB.Stream") objStream.Type = 1 objStream.Open objStream.Write imgs objStream.SaveToFile tofile, 2 objStream.Close Set objStream = Nothing saveimage = True Else saveimage = False End If End Function
private Function getHTTPPage(url) On Error Resume Next Dim html>http Set html>http = CreateObject("MSXML2.XMLHTTP") html>http.Open "GET", url, False html>http.send If html>http.readyState <> 4 Then Exit Function End If getHTTPPage = html>http.responseBody Set html>http = Nothing If Err.Number <> 0 Then Err.Clear End Function
private Function getimgs(str) getimgs = "" Set objRegExp1 = New RegExp objRegExp1.IgnoreCase = True objRegExp1.Global = True objRegExp1.Pattern = "html>http://.+?""" Set mm = objRegExp1.Execute(str) For Each Match1 In mm getimgs = getimgs & "||" & Left(Match1.Value, Len(Match1.Value) - 1) Next End Function
Function str2img() Dim servername, objRegExp, strs, Matches, RetStr, arrimg, newimg, i, fname, states, arrnew, arrall if baseurl<>"" then If Right(baseurl, 1) <> "/" Then baseurl = baseurl & "/" End If end if if right(tofolder,1)<>"\" then tofolder=tofolder&"\" end if Set objRegExp = New RegExp objRegExp.IgnoreCase = True objRegExp.Global = True objRegExp.Pattern = "<img.+?>" strs = Trim(processstr) Set Matches = objRegExp.Execute(strs) For Each Match In Matches RetStr = RetStr & getimgs(Match.Value) Next arrimg = Split(RetStr, "||") allimg = "" newimg = "" For i = 1 To UBound(arrimg) If arrimg(i) <> "" And InStr(allimg, arrimg(i)) < 1 Then fname1 = baseurl & CStr(basefilename & i & Mid(arrimg(i), InStrRev(arrimg(i), "."))) fname = tofolder & CStr(basefilename & i & Mid(arrimg(i), InStrRev(arrimg(i), "."))) states = saveimage(arrimg(i), fname) If states = True Then allimg = allimg & "||" & arrimg(i) newimg = newimg & "||" & fname1 End If End If Next arrnew = Split(newimg, "||") arrall = Split(allimg, "||") For i = 1 To UBound(arrnew) if i=1 then firstoldimg=arrall(1) firstnewimg=arrnew(1) end if strs = Replace(strs, arrall(i), arrnew(i)) Next str2img = strs End Function end class
第一步用户登录的时候:由于有一个工作区,所以最好不要让多个用户用同一个帐号不然到时候有人登出的时候,将会造成其它人的工作丢失,这里最主要处理的是帐户登录的时候要对这个帐号锁定不允许重复登录(主要由FSO和数据库来实现,我就不多说了)。
在处理文件上传的时候,可以用稻香老农的无组件上传,把asp>图片传到工作区中。并且把asp>图片代码返回到编辑器中,当提交以后,将由以下代码来处理这些asp>图片,我这里是根据新闻或文章的ID来创建文件夹的: sql="select top 1 form news where id is null" set rs=server.createobject("adodb.recordset") rs.open sql,conn,1,3 rs.addnew rs("userid")=session("myid")’因为是新加的,所以先加上一条来取得ID rs.update newID=rs("newsid")’大部分情况下,这样可以取得ID的,可是为了保险起见,所以最好还是再判断一下了 rs.close set rs=nothing if newsID="" then set rs=conn.execute("select top 1 newsid from news where userid=" & session("myid") & " order by newsid desc") newsID=rs("newsid") end if
basefoder=server.mappath("photo")’假设asp>图片存到当前目录下面的photo里面 set fso=Server.CreateObject("Scripting.FileSystemObject") FiLePaTh = basefoder&"/"&newsID Fso.Createfolder(FiLePaTh) ’假设将取得新闻的内容存在变量content里面下面就调用我的那个类blacksmith来处理分析文章的内容,处理asp>图片的转移了 set bs=new blacksmith bs.size=1 bs.baseurl="photo/"&newsID’给asp>图片加上目录的地址 bs.basefilename="mynews"’给asp>图片加上前缀 bs.servername = "" bs.tofolder=FiLePaTh bs.processstr=content content=bs.str2img set bs=nothing ’接下来就是新闻内容的保存的过程了,我这里就省去了,和其它的系统应该是一样的了
在处理新闻的修改的时候用: ’创建工作目录 set fso=Server.CreateObject("Scripting.FileSystemObject") FiLePaTh = server.mappath("temp"&session("myid")) If Not FSO.FolderExists(FiLePaTh) Then Fso.Createfolder(FiLePaTh) End If
FiLePaTh = basefoder&"/"&newsID If FSO.FolderExists(fp) Then on error resume next fso.copyfile fp&"\*.*",FiLePaTh&"\"’把那个目录下面的所有文件全拷到工作目录下面,防止出现修改了不保存,所以先不删除原有的内容 if err.num>0 then err.clear End If set fso=nothing end if
’把原有的文件内容进行处理,改变里面的asp>图片路径,比如说这此内容还是保存在content里面 content=replace(trim(content,"photo/"&newsID&"/mynews","temp"&session("myid")&"/mynews")’这个只是一个比较简单的替换,相信由此引起误替换的机会应该是相当小的了 保存的过程和添加的过程是一样的,所不同的是,要先把原来的那个目录里面的文件清空,我这里就不多说了。 新闻删除的时候,要记着把这个ID相对应的文件夹删除了,在用户登出的时候,也要把它的工作目录清空。 好了,我的整个思路就是这样的了,说不上是什么精品,但是它在实际的应用中,一年下来并没有产生过任何的意常,所以我就把它贴出来了,欢迎大家和我交流:E_mail:clzwin@sina.com |
|
利用XMLHTTP无刷新获取数据
|
客户端和服务器端数据的交互有几种方法. 1.提交,通过<form></form>提交到服务器端.也称"有刷新"吧. 2.通过XMLHTTP无刷新提交到服务器端,并返回数据.也称"无刷新"吧. 利用XMLHTTP我们可以实现很多很强大的应用.这文章主要介绍它的一 些简单的应用.
附:因为XMLHTTP是IE5.0+支持的对象.所以你必须要有IE5.0+才能看到效果.
client.htm
<script language="JavaScript"> function GetResult(str) { /* *--------------- GetResult(str) ----------------- * GetResult(str) * 功能:通过XMLHTTP发送请求,返回结果. * 参数:str,字符串,发送条件. * 实例:GetResult(document.all.userid.value); * author:wanghr100(灰豆宝宝.net) * update:2004-5-27 19:02 *--------------- GetResult(str) ----------------- */ var oBao = new ActiveXObject("Microsoft.XMLHTTP"); //特殊字符:+,%,&,=,?等的传输解决办法.字符串先用escape编码的. //Update:2004-6-1 12:22 oBao.open("POST","server.asp?userid="+escape(str),false); oBao.send(); //服务器端处理返回的是经过escape编码的字符串. document.all.username.value=unescape(oBao.responseText) } </script> <input type="button" onclick="GetResult(document.all.userid.value)" value="Get"><br> userid:<input type="text" name="userid"><br> username:<input type="text" name="username">
server.asp 服务器端处理.
<% @Language="JavaScript" %> <% function OpenDB(sdbname) { /* *--------------- OpenDB(sdbname) ----------------- * OpenDB(sdbname) * 功能:打开数据库sdbname,返回conn对象. * 参数:sdbname,字符串,数据库名称. * 实例:var conn = OpenDB("database.mdb"); * author:wanghr100(灰豆宝宝.net) * update:2004-5-12 8:18 *--------------- OpenDB(sdbname) ----------------- */ var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname); var conn = Server.CreateObject("ADODB.Connection"); conn.Open(connstr); return conn; } var sResult = ""; var oConn = OpenDB("data.mdb"); //特殊字符:+,%,&,=,?等的传输解决办法.客户端字符是经过escape编码的 //所以服务器端先要经过unescape解码. //Update:2004-6-1 12:22 var userid = unescape(Request("userid")); var sql = "select username from users where userid=’"+userid+"’"; var rs = oConn.Execute(sql); if(!rs.EOF) { sResult = rs("username").Value; } else { //加入容错.2004-5-30 10:15 sResult = "Sorry,没有找到..." } //escape解决了XMLHTTP。中文处理的问题. Response.Write(escape(sResult)); %>
数据库设计 data.mdb 表users. 字段 id 自动编号 userid 文本 username 文本
表:users 数据: id userid username 1 wanghr100 灰豆宝宝.net |
|
ASP知识讲座[环境变量]
|
学习ASP,最重要的就是要掌握ASP内置的六大对象。事实上,在上一讲中,我们已经了解了 Response对象(是吗?有没有搞错!),及Response对象中最常用的Write方法、Redirect方 法和Expires属性。看到对象、方法、属性、集合、事件这些概念(俺一个都不识!),如果以 前没接触过,聪明的您就不要管这些概念了,知道怎么用就行了,我的观点是刚开始关键在于临 摹。下面我们继续通过实例学习Request对象,为了加深理解,务请运行这些程序看看输出结果 一、 使用Request.ServerVariables获取环境变量,这部分内容很简单,但获取的内容却很重 要,如何获取?请看下例: <%@ Language=VBScript %> <HTML><BODY> <% ’wuf8.asp Response.Write "运行ASP文件的路径: " &_ Request.ServerVariables("Script_Name") & "<Br>" Response.Write "返回content的数据长度: " &_ Request.ServerVariables("Content_Length") & "<Br>" Response.Write "返回客户的IP地址: " &_ Request.ServerVariables("Remote_Addr") & "<Br>" Response.Write "浏览器名: " &_ Request.ServerVariables("HTTP_USER_AGENT") & "<Br>" Response.Write "返回主页实际物理路径: " &_ Request.ServerVariables("APPL_PHYSICAL_PATH") & "<Br>" %> <table colspan=8 cellpadding=5 border=0> <tr> <td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">环境变量名</font></td> <td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">内容</font></td> </tr> <tr> <td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"> result1 </font></td> <td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"> result2 </font></td></tr> </table> </BODY></HTML> Now,你应该发现上一讲中的例程wuf2.asp原来是多么的easy! 注意:该程序的后面一部分HTML标记纯是为下面的例子作准备的,所以不要觉得奇怪。那么,还 有哪些环境变量呢?运行下面的例子就知道了(本程序删除了部分代码,最好去我站点下载源程 序便于理解)。 <%@ Language=VBScript %> <% ’wuf9.asp Option Explicit Dim Sv %> <HTML><BODY> <table colspan=8 cellpadding=5 border=0> <tr> <td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">环境变量名</font></td> <td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">结果</font></td> </tr> <% for each Sv In Request.ServerVariables Response.Write "<tr>" Response.Write "<td bgcolor=’f7efde’ align=CENTER> <font style=’ARIAL NARROW’ size=’2’>" Response.Write Sv Response.Write "</font></td>" Response.Write "<td bgcolor=’f7efde’ align=CENTER> <font style=’ARIAL NARROW’ size=’2’>" Response.Write Request.ServerVariables(Sv) Response.Write "</font></td></tr>" next %> </table> </BODY></HTML> 这里使用了For…Each循环,用来列举一个集合中的所有元素。如果后半部分看不懂,请对照 wuf8.asp,再瞧瞧运行结果,仔细体会一下(什么态度?)。 二、 通过表单向服务器传送数据(也可这样理解,服务器端如何读取客户端发送的数据)做过 主页,应该知道很多主页通常都使用Form表单让用户输入数据,然后通过"submit(提交)"按 钮发送数据。From表单中的"method"有两种主要方法:POST和GET,而"action"后一般都是指 定一个.cgi、.pl或.asp文件,今天我们要学习的就是如果编写这个.asp文件。 (一) 如果使用POST方法传送数据,则用Request.Form来读取数据。先编辑如下一个 wuf10.htm文件,供用户输入数据: <html> <body bgcolor="#FFFFFF"> <form method="post" action="wuf11.asp"> 姓名: <input type="text" name="yourname"><br> 性别: <select name="gender"> <option>男</option> <option>女</option> </select> <br> 留言: <textarea name="message">您好! 注意多行文本的处理</textarea> <br> 爱好(按住Ctrl键可多选): <select name="hobby" multiple size="4"> <option>电脑</option> <option>购物</option> <option>电影</option> <option>读书</option> </select> <br> <input type="submit" name="Submit" value="提交"> <input type="reset" name="Submit2" value="Reset"> </form> </body> </html> 再编写一个wuf10.htm需用到的文件wuf11.asp收集数据: <%@ Language=VBScript %> <% ’wuf11.asp Option Explicit Response.Expires=0 Dim StrName, StrGender, StrM, StrMsg StrName = Trim(Request.Form("yourname")) ’Trim函数用来除首尾空格 StrGender = Trim(Request.Form("gender")) StrM = Trim(Request.Form("message")) StrMsg = Replace(StrM,vbcrlf,"<Br>" & vbcrlf) ’ vbcrlf相当于回车符和换行符的组合。至于Replace函数,其作用就是将字符串StrM中的 vbcrlf替换为"<Br>" & vbcrlf(请思考这个vbcrlf有什么用?查看输出文件的HTML源码就明 白了),详细请参考VBScript帮助。 %> <HTML><BODY> 姓名: <%= StrName%><Br><Br> 性别: <%= StrGender%><Br><Br> 留言: <Br><Br> <%= StrM%><Br><Br> <%= StrMsg%><Br><Br> 实际上, "提交"按钮的值也被传递: <Br> <%= Request.Form("Submit")%><Br><Br> <% ’先把上面看懂, 有兴趣再看看如何读取多个选项 Response.Write "共选择爱好项数:" & Request.Form("hobby").Count & "<Br>" Dim I For I = 1 to Request.Form("hobby").Count Response.Write Request.Form("hobby")(I) & "<Br>" Next %> </BODY></HTML> 在这个的例子中,为了便于理解,我们使用了两个程序,实际上只使用一个程序也可以,如果有 兴趣请看下面的例程wuf12.asp,有助于加深对环境变量的理解。 <%@ Language=VBScript %> <% ’wuf12.asp Option Explicit Response.Expires=0 Dim StrName, StrGender, StrM, StrMsg If Request.ServerVariables("Content_Length") <> 0 Then ’提交数据后,这个长度就不会是 0, 因此执行下面的语句, 将结果显示出来 ’下面一部分实际上是照搬 wuf11.asp StrName = Trim(Request.Form("yourname")) StrGender = Trim(Request.Form("gender")) StrM = Trim(Request.Form("message")) StrMsg = Replace(StrM,vbcrlf,"<Br>" & vbcrlf) %> <HTML><BODY> 姓名: <%= StrName%><Br><Br> 性别: <%= StrGender%><Br><Br> 留言: <Br><Br> <%= StrM%><Br><Br> <%= StrMsg%><Br><Br> <% Response.Write "共选择爱好项数:" & Request.Form("hobby").Count & "<Br>" Dim I For I = 1 to Request.Form("hobby").Count Response.Write Request.Form("hobby")(I) & "<Br>" Next %> </BODY></HTML> <% Else ’当第一次加载页面时,没有提交任何数据,故前面一部分并不执行,而是从这里开始 ’这也就是为什么会有两对 <HTML></HTML> 的原因 ’下面照搬 wuf10.htm 就行了 ’<form method="post" action="wuf11.asp"> 给用环境变量替换掉了, 其实完全一样 Response.Write "看看结果: " & Request.ServerVariables("Script_name") & "<Br>" %> <HTML><BODY> <form method="post" action="<%= Request.ServerVariables("Script_name")%>"> 姓名: <input type="text" name="yourname"><br> 性别: <select name="gender"> <option>男</option> <option>女</option> </select> <br> 留言: <textarea name="message">您好! 注意多行文本的处理</textarea> <br> 爱好(按住Ctrl键可多选): <select name="hobby" multiple size="4"> <option>电脑</option> <option>购物</option> <option>电影</option> <option>读书</option> </select> <br> <input type="submit" name="Submit" value="提交"> <input type="reset" name="Submit2" value="Reset"> </form> </BODY></HTML> <%End If%> (二)如果使用GET方法传送数据,则用Request.Querystring来读取数据。先编辑如下一个 wuf13.htm文件,供用户输入数据 <html> <body bgcolor="#FFFFFF"> <form method="get" action="wuf14.asp"> 英文姓名: <input type="text" name="Ename"> <br> 中文姓名: <input type="text" name="Cname"><br> 性别: <select name="gender"> <option>男</option> <option>女</option> </select> <br> <input type="submit" name="Submit" value="提交"> <input type="reset" name="Submit2" value="Reset"> </form> </body> </html> 再编写一个wuf13.htm需用到的文件wuf14.asp收集数据: <%@ Language=VBScript %> <% ’wuf14.asp Option Explicit Response.Expires=0 Dim StrCname, StrEname, StrGender StrEname = Trim(Request.QueryString("Ename")) ’Trim函数用来除首尾空格 StrCname = Trim(Request.QueryString("Cname")) StrGender = Trim(Request.QueryString("gender")) %> <HTML><BODY> 英文姓名: <%= StrEname%><Br><Br> 中文姓名: <%= StrCname%><Br><Br> 性别: <%= StrGender%><Br><Br> 看看提交的字符串: <Br> <%= Request.ServerVariables("Query_String")%> </BODY></HTML> 为了更好地理解这个程序,你最好先在浏览器中试试例程wuf13.htm的效果,看看输出的结果, 你会发现地址栏中长长的字符串似曾相识,如同在Yahoo搜索时看到的差不多。这时,你试着在 地址栏中直接输入"http://localhost/wuf14.asp?Ename=Rose&Cname=李二&gender=女" 居 然也得到了同样的结果。所以你可以这样看,wuf13.htm的结果就是得到了类似这样的一个带参 数的链接。而Request.QueryString则是从http:// 地址的附加参数中读取各个数据。 实际上当按"提交"按钮后,查询字符串(输入的数据)会以参数的形式附加到URL地址后(各参 数间以"&"分隔),达到传递数据的目的。同时,注意浏览器中显示的查询字符串中没有中文, 而是不认识的含百分号的乱码,这是因为进行了编码的缘故。最后,与前面一样,这两个程序也 可合并为一个程序(例程wuf15.asp,需去我站点下载)。 几点说明: 1. 若使用POST方法提交数据,则Request.ServerVariables("Content_Length")>0。 若使用GET方法提交数据,则Request.ServerVariables("Query_String") <> ""。 2.弄懂原理后你完全可以在同一个ASP文件中混合使用Request.Form和Request.QueryString 3. 如果在一个Form表单中,有几个按钮,你如何确定用户按了哪个按钮?如果留意的话,会发 现例程wuf11.asp中有一句,"提交"按钮的值也被传送,而wuf13.htm中生成的查询字符串最后 也可以找到类似的值。请注意:只有被按按钮的值被传送,而其他按钮的值为"",这就是判断依 据 |
|
mailto: URL 工具
|
原文出处:http://webreference.com/js/column70/index.html
纲要
JavaScript中,mailto: 这个 URL 功能很强,然而却很少用到。原因之一是开发者只熟悉它的基本功能,而不了解它的多属性支持。mailto: URL 不仅支持邮件地址,还支持 cc、bcc、subject 和 body 域。我们可以通过编写脚本组装一个完整的邮件功能,这看起来应该比那些采用提示用户发送他们的反馈、错误报告、抱怨和称赞等等方式的站点更显温柔、更受欢迎。
URL的语法
本文我们讨论 mailto: URL 的几个部分。首先我们解释 mailto: URL 支持的多个属性 (to、cc、bcc、 subject 和 body)。我们准备了一个简单的 mailto: URL 工具帮助我们生成、查看和测试 mailto: URL。最后,我们演示一个组装 mailto: URL 的脚本。 阅读本文我们将学会: 如何mailto: URL的语法 如何使用 mailto: URL 工具 如何编写 mailto: URL 工具的 HTML 部分 如何编写 mailto: URL 工具的脚本部分 (I) 如何编写 mailto: URL 工具的脚本部分 (II) 如何编写生成 mailto: URL 的脚本 我们以HTML格式提供mailto: URL工具的清单以及 mailto: URL 生成脚本。 mailto: URL 允许你提供信件的收件人地址、主题、抄送或加密抄送和信件的主体以格式化信件。最简单的、也是最常用的 mailto: URL 是指定信件的发送地址。 嵌入在 HTML 标记中时,就像下面一样: < A HREF="mailto:gwok@yeah.net">发送信件< /A> 如果你希望指定信件的其他属性,可以以名/值 (名=值) 对的方式将它们添加到 URL 中。每个属性名后紧随一个等号和一个值。用问号(?) 将“名/值”对和电子邮件地址分开。名/值对之间以 & 分隔。 mailto:xxx@xxxx.net?cc=aegis@yeah.net&bcc=tony@yahoo.com&subject=Your_Tips 具体HTML代码是: < A HREF="mailto:gwok@yeah.net?cc=aegis@yeah.net&bcc=tony@yahoo. com&subject=Your_Tips">欢迎提供反馈< /A> 欢迎提供反馈 在 Mac 系统上, IE 不能分辨 bcc 参数并且会将其添加到 cc 中。例如,当你点击以上连接时,新邮件窗口中的 cc 地址将显示为 aegis@yeah.net&bcc。请避免在这一系统下的浏览器中使用 bcc 参数。另外,Lotus Notes只支持 mailto: URL 中的地址域,指定其他属性会引起混乱。
正文
邮件工具
點擊下面[运行代码]按扭運行以下代码,如果看不到月厉請刷新一次点击[运行代码]打開的網頁: <STYLE TYPE="text/css">
<!--
FORM.tb {display:inline;}
.twidth{width:100%}
.include{ font-size: 75%; font-family: verdana, arial, helvetica;}
.includebig{font-family: verdana, arial, helvetica;}
.includebig A:link { color: blue; }
.includebig A:visited { color: purple; }
.include A:link { color: blue; }
.include A:visited { color: purple; }
.submitter { font-size: 75%; font-family: verdana, arial, helvetica; }
.codehighlight {background:#eee}
.WRy1{background:#fc0}
.WRy2{background:#fff3ac}
pre.code {color: #660099; margin-left:5%}
address {text-align: right}
body {background:#FFFFFF; margin-left: 5%; margin-right: 5%}
.WRBannerCenter {margin-left:-5%; margin-right:-5%; margin-top:8px; margin-bottom:8px; text-align:center}
-->
</STYLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
// CREATE A MAILTO URL OR MAILTO ANCHOR TAG
function createMailto(sourceForm, targetField, urlType) {
var to = sourceForm.to.value;
var cc = sourceForm.cc.value;
var bcc = sourceForm.bcc.value;
var subject = sourceForm.subject.value;
var body = sourceForm.body.value;
var linkText= sourceForm.linkText.value;
if (linkText == "") {
linkText = "链接文本";
}
var urltext = "";
// IF THE VALUE IS SET, INCLUDE IT IN THE URL
if (to != "") {
urltext += to;
}
else {
alert("Sorry, you must fill out the 'To' field");
sourceForm.to.focus();
return(1);
}
if (cc != "") {
urltext = addDelimiter(urltext);
urltext += "CC=" + cc;
}
if (bcc != "") {
urltext = addDelimiter(urltext);
urltext += "BCC=" + bcc;
}
if (subject != "") {
urltext = addDelimiter(urltext);
urltext += "Subject=" + escape(subject);
}
if (body != "") {
urltext = addDelimiter(urltext);
urltext += "Body=" + escape(body);
}
if (urlType == "url") {
urltext = "mailto:" + urltext;
}
else {
urltext = "<A HREF=\"mailto:" + urltext + "\">" + linkText + "</A>";
}
// PUT THE NEW URL IN THE FORM FIELD
targetField.value = urltext;
// GIVE THE FIELD FOCUS AND HIGHLIGHT THE TEXT --
// TO FACILITATE EASY COPYING AND PASTING OF THE NEW URL
targetField.focus();
targetField.select();
return(1);
}
// ADD THE "?" OR "&" NAME/VALUE SEPARATOR CHARACTER
function addDelimiter(inputString) {
var inString = inputString;
// IF '?' NOT FOUND, THEN THIS IS THE FIRST NAME/VALUE PAIR
if (inString.indexOf("?") == -1) {
inString += "?";
}
// ELSE IT'S A SUBSEQUENT NAME/VALUE PAIR, SO ADD THE '&' CHARACTER
else {
inString += "&";
}
return inString;
}
// TEST THE MAILTO URL -- ASSIGN THE URL TO THE DOCUMENT LOCATION
// TO POP UP THE MESSAGE WINDOW
function testMailto(loc) {
var doc = loc;
// IF MAILTO URL IS EMBEDDED IN AN ANCHOR TAG
if (doc.indexOf("HREF=") != -1) {
// EXTRACT THE MAILTO URL FROM THE ANCHOR TAG
var doc = doc.substring(doc.indexOf("HREF=")+6, doc.indexOf(">")-1);
}
// ASSIGN THE MAILTO URL TO THE DOCUMENT (THIS WILL POP UP A MAIL WINDOW)
window.location = doc;
}
function viewMailto(linkText) {
alert("URL:\n\n" + linkText);
}
// -->
</SCRIPT>
</HEAD>
</HEAD>
<BODY BGCOLOR="#ffffff">
<table cellpadding=0 cellspacing=0 border=0 class=twidth><tr>
<td valign=top><style type="text/css">
<!--
#WDinclude {font-size:75%; font-family:verdana, arial, helvetica}
.WDi {font-family:verdana, arial, helvetica}
#WDinclude A:link {color: blue}
.WDi A:link {color:blue}
#WDinclude A:visited {color: purple}
.WDi A:visited {color: purple}
.WRy1{background:#fc0} .WRy2{background:#fff3ac}
-->
</style>
<FORM NAME="mailtoForm">
<CENTER>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffff99">
<TR ALIGN="LEFT" VALIGN="TOP">
<TD COLSPAN="4"> <CENTER>
<FONT COLOR="#408080" SIZE=+1 face="Arial, Helvetica, sans-serif"><strong>输入邮件信息
</strong> </FONT>
</CENTER></TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD><FONT FACE="Arial, Helvetica" SIZE=-1><B>收件人:</B></TD>
<TD><INPUT TYPE="text" NAME="to" SIZE=30 STYLE="background-color:'#ffcc66'"></TD>
<TD><FONT FACE="Arial, Helvetica" SIZE=-1><B>抄送:</B></TD>
<TD><INPUT TYPE="text" NAME="cc" SIZE=30 STYLE="background-color:'#ffcc66'"></TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT"><FONT FACE="Arial, Helvetica" SIZE=-1><B>密件:</B></TD>
<TD><INPUT TYPE="text" NAME="bcc" SIZE=30 STYLE="background-color:'#ffcc66'"></TD>
<TD><FONT FACE="Arial, Helvetica" SIZE=-1><B>邮件标题:</B></TD>
<TD><INPUT TYPE="text" NAME="subject" SIZE=30 STYLE="background-color:'#ffcc66'"></TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT"><FONT FACE="Arial, Helvetica" SIZE=-1><B>邮件内容:</B></TD>
<TD COLSPAN="4"><TEXTAREA NAME="body" WRAP="VIRTUAL" COLS=50 ROWS=3 STYLE="background-color:'#ffcc66'"></TEXTAREA></TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT"><FONT FACE="Arial, Helvetica" SIZE=-1><B>链接文本:</B></TD>
<TD COLSPAN="3"><INPUT TYPE="text" NAME="linkText" SIZE=73 STYLE="background-color:'#ffcc66'"></TD>
</TR>
<TR>
<TD COLSPAN="4"> <CENTER>
<INPUT TYPE="Reset" NAME="Clear" Value="Clear">
<INPUT TYPE="button" NAME="CreateURL" VALUE="Create URL" onClick="createMailto(document.mailtoForm, document.mailtoForm.text, 'url')">
<INPUT TYPE="button" NAME="CreateAnchor" VALUE="Create Link" onClick="createMailto(document.mailtoForm, document.mailtoForm.text, 'anchor')">
</CENTER></TD>
</TR>
<TR>
<TD COLSPAN="4"> <CENTER>
<FONT COLOR="#408080" SIZE=+1><B>显示你的mailto: URL</B></FONT>
</CENTER></TD>
</TR>
<TR>
<TD ALIGN="LEFT"><FONT FACE="Arial, Helvetica" SIZE=-1><B>mailto URL:</B></TD>
<TD COLSPAN="3"><INPUT TYPE="text" NAME="text" SIZE=73 STYLE="background-color:'#ffcc66'"></TD>
</TR>
<TR>
<TD COLSPAN="4"> <CENTER>
<INPUT TYPE="button" NAME="Test" VALUE="Test URL" onClick="testMailto(document.mailtoForm.text.value)">
<INPUT TYPE="button" NAME="View" VALUE="View URL" onClick="viewMailto(document.mailtoForm.text.value)">
</CENTER></TD>
</TR>
</TABLE>
</CENTER>
</FORM>
</td>
</tr>
</table>
[Ctrl+A 全选 Ctrl+C 复制,如不能正常显示请刷新一下]
使用 mailto: URL 工具 mailto: URL 工具给你提供了创建 mailto: URL 的一个简单方法。这个工具基于我们简化并扩展了的一个 Netscape 脚本。试一试如何使用它。填写地址、cc、bcc、subject 和 body 域。按钮 Create URL 生成一个 mailto: URL。按钮 Create Link 生成一个带有链接文字的完整链接元素,链接文字可以在相应的域里指定。按钮 Clear 清除所有输入域。mailto: 域显示生成的 URL 或链接。按钮 View URL 弹出一个带有 URL 的警告窗口。按钮 Test URL 调用默认的邮件程序,并弹出一个和填写的输入域相适应的新邮件窗口。最后,从mailto:域复制生成的URL并将其粘贴到你的页面中。
编写 mailto: URL 工具的用户界面
mailto: URL 工具包含两部分。HTML 部分定义了表单自身。表单包括基本输入元素如文本框、文本区和按钮。这些输入的的重要属性是:NAME。所有对这些域值的引用都是通过它们的 NAME 属性。如果表单的 name 是 mailtoForm,而输入域的 name 是 NAME="subject",那么域值就是:
mailtoForm.subject.value 你也可以通过对 mailtoForm.subject.value 赋值来设置这个域。按钮被赋予了要在本文后面讨论的以下事件驱动程序: createMailto()、testMailto() 和 viewMailto()。注意按钮 TYPE="Reset",它清除表单中的所有域,没有被显式指定事件驱动程序。VALUE 域决定按钮上显示的文字。SIZE 属性以字符为单位指定了域的宽度。COLSPAN 属性指定了表格中的一列占据多少个单元格 (如果未指定,默认值为1)。以下是 HTML 代码,它的大部分都是比较简单的:
< BODY> < FONT FACE="Arial, Helvetica" SIZE=-1> < CENTER>< H1>Create a mailto: URL< /H1>< /CENTER> < FORM NAME="mailtoForm"> < CENTER> < TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffff99" > < TR ALIGN="LEFT" VALIGN="TOP"> < TD COLSPAN="4"> < CENTER>< B>< FONT COLOR="#408080" SIZE=+1>在这里输入邮件细节< /FONT>< /B>< /CENTER>< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD>< FONT FACE="Arial, Helvetica" SIZE=-1>< B>To:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="to" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < TD>< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Cc:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="cc" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Bcc:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="bcc" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < TD>< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Subject:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="subject" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Body:< /B>< /TD> < TD COLSPAN="4">< TEXTAREA NAME="body" WRAP="VIRTUAL" COLS=63 ROWS=3 STYLE="background-color:'#ffcc66'">< /TEXTAREA>< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Link Text:< /B>< /TD> < TD COLSPAN="3">< INPUT TYPE="text" NAME="linkText" SIZE=73 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR> < TD COLSPAN="4"> < CENTER> < INPUT TYPE="Reset" NAME="Clear" Value="Clear"> < INPUT TYPE="button" NAME="CreateURL" VALUE="Create URL" onClick="createMailto(document.mailtoForm, document.mailtoForm.text, 'url')"> < INPUT TYPE="button" NAME="CreateAnchor" VALUE="Create Link" onClick="createMailto(document.mailtoForm, document.mailtoForm.text, 'anchor')"> < /CENTER> < /TD> < /TR> < TR> < TD COLSPAN="4"> < CENTER>< FONT COLOR="#408080" SIZE=+1>< B>这里是你的 mailto: URL< /B>< /FONT>< /CENTER> < /TD> < /TR> < TR> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>mailto URL:< /B>< /TD> < TD COLSPAN="3">< INPUT TYPE="text" NAME="text" SIZE=73 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR> < TD COLSPAN="4"> < CENTER> < INPUT TYPE="button" NAME="Test" VALUE="Test URL" onClick="testMailto(document.mailtoForm.text.value)"> < INPUT TYPE="button" NAME="View" VALUE="View URL" onClick="viewMailto(document.mailtoForm.text.value)"> < /CENTER> < /TD> < /TR> < /TABLE> < /CENTER> < /FORM> < /FONT> < /BODY>
编写 mailto: URL 工具的脚本 (I)
mailto: 工具的脚本部分包括四个函数: createMailto()、testMailto()、viewMailto() 和 addDelimiter()。我们先看短的,函数 viewMailto() 使用 alert 来显示 URL:
function viewMailto(mailtoText) { alert("URL:nn" + mailtoText); } 函数 addDelimiter() 在表示地址的名/值对前添加问号 (?),在其它名/值对之间添加 &。我们通过在 URL 文本中查找问号来确定添加了哪一个分隔符。如果已经有问号了,我们添加 &。否则,我们就添加问号:
// 添加 "?" 或 "&" 做为名/值对的分隔符 function addDelimiter(inputString) { var inString = inputString;
// 如果找不到 '?',那么这是第一个名/值对 if (inString.indexOf("?") == -1) { inString += "?"; } // 否则这是随后的名/值对,添加字符 "&" else { inString += "&"; } return inString; } 函数 testMailto() 模拟点击 mailto: URL 时的效果。有一点复杂的是当传递给函数一个链接而不是 URL 时,从链接中抽取 URL。我们通过将它赋值给 window.location 来测试 URL:
// 测试 mailto: URL — 将 URL 赋值给文档的 location // 以弹出邮件窗口 function testMailto(loc) { var doc = loc;
// 如果 mailto: URL 嵌入在 anchor 标记中 if (doc.indexOf("HREF=") != -1) { // 从 anchor 标记中抽取 mailto: URL var doc = doc.substring(doc.indexOf("HREF=")+6, doc.indexOf(">")-1); }
// 将 mailto: URL 赋值给文档 (弹出一个邮件窗口) window.location = doc; }
编写 mailto: URL 工具的脚本 (II)
mailto: URL 工具的主函数是 createMailto()。这个函数接受三个参数:sourceForm (表单名)、targetField (mailto: URL 的目标域名称) 和 urlType (是 url 还是 anchor)。函数 createMailto() 将用户填写的表单域组装成 mailto: URL。我们首先找到用户的输入值:
var to = sourceForm.to.value; var cc = sourceForm.cc.value; var bcc = sourceForm.bcc.value; var subject = sourceForm.subject.value; var body = sourceForm.body.value; var linkText= sourceForm.linkText.value; 变量 linkText 表示将要在链接位置上显示的文本。这个域是可选的,我们默认将它设置为空:
if (linkText == "") { linkText = "Link Text"; } 函数循环地查看每一个域,将它们一个一个地添加到 URL,并添加适当地分隔符:
var urltext = "";
// 如果此值已设置,将其包含到 URL 中 if (to != "") { urltext += to; } else { alert("Sorry, you must fill out the 'To' field"); sourceForm.to.focus(); return(1); } if (cc != "") { urltext = addDelimiter(urltext); urltext += "CC=" + cc; } if (bcc != "") { urltext = addDelimiter(urltext); urltext += "BCC=" + bcc; } if (subject != "") { urltext = addDelimiter(urltext); urltext += "Subject=" + escape(subject); } if (body != "") { urltext = addDelimiter(urltext); urltext += "Body=" + escape(body); } if (urlType == "url") { urltext = "mailto:" + urltext; } else { urltext = "< A HREF="mailto:" + urltext + "">" + linkText + "< /A>"; } 注意我们用escape来处理参数 subject 和 body。这样允许在信件的主题和内容中将 & 和问号 (?) 作为合法字符使用。剩下的就是在 mailto: 域中书写 URL 文本,并将焦点和选择设置到它上面:
// 把新的 URL 放到表单域中 targetField.value = urltext;
// 将焦点设置到此域并高亮显示其文本—这样可以方便地剪贴新 URL targetField.focus(); targetField.select(); return(1);
编写基于脚本的工具
这里我们准备的第二个 mailto: URL 工具仅仅基于一个脚本。它设置信件的细节然后弹出一个填写了细节的信件。以下按钮时调用函数 popupMessage():
點擊下面[运行代码]按扭運行以下代码,如果看不到月厉請刷新一次点击[运行代码]打開的網頁: <SCRIPT language=JavaScript>
<!--
// POP UP A PREFORMATTED EMAIL MESSAGE WINDOW
function popupMessage() {
// SET MESSAGE VALUES
var to = "tomer@netscent.com";
var cc = "yehuda@internet.com";
var bcc = "tomer@internet.com";
var subject = "Comments about your tips";
var body =
"Tomer and Yehuda,\n\n\tI'd like to suggest the following improvements to your tips: \n"
+
"\nFirst, ..." +
"\nAlso, sometimes...." +
"\n\nSincerely,\n\n" + "Your faithful reader...";
// BUILD MAIL MESSAGE COMPONENTS
var doc = "mailto:" + to +
"?cc=" + cc +
"&bcc=" + bcc +
"&subject=" + escape(subject) +
"&body=" + escape(body);
// POP UP EMAIL MESSAGE WINDOW
window.location = doc;
}
// -->
</SCRIPT>
<P>
<FORM><INPUT onclick=popupMessage() type=button value="Test mailto: URL" name=Test> </FORM></P>
[Ctrl+A 全选 Ctrl+C 复制,如不能正常显示请刷新一下]
以上的按钮是这样创建的:
< FORM> < INPUT TYPE="button" NAME="Test" Value="Test mailto: URL" onClick="popupMessage()"> < /FORM> 函数 popupMessage() 的定义为:
function popupMessage() { // 设置信件 var to = "gwok@yeah.net";
var cc = "dehaili@netease.com"; var bcc = "gwok@netease.com"; var subject = "Comments about your tips"; var body = "gwok and dhl," + "nntI'd like to suggest the following improvements to your tips: n" + "nFirst, ..." + "nAlso, sometimes...." + "nnSincerely,nn" + "Your faithful reader...";
// 创建邮件 URL var doc = "mailto:" + to + "?cc=" + cc + "&bcc=" + bcc + "&subject=" + escape(subject) + "&body=" + escape(body);
// 弹出信件 window.location = doc; } 注意在组装 subject 和 body 域时使用的函数 escape()。它将任何非字母、数字字符转换为 ASCII 值 (以十六进制符号表示)。这样,在 body 和 subject 中的任何 & 和问号 (?) 就不会在浏览器解释 mailto: URL 时被扰乱。问号 (?) 和 & 是 mailto: URL 中的分隔符,在信件中直接使用它们肯定会扰乱对 mailto: URL 的解释。弹出新邮件窗口是通过将 mailto: 的文本赋值给 window.location 完成的。
脚本的代码
< HTML> < HEAD> < TITLE>创建 mailto: URL< /TITLE> < SCRIPT LANGUAGE="JavaScript"> < !-- // 创建 mailto: URL anchor 标记 function createMailto(sourceForm, targetField, urlType) { var to = sourceForm.to.value; var cc = sourceForm.cc.value; var bcc = sourceForm.bcc.value; var subject = sourceForm.subject.value; var body = sourceForm.body.value; var linkText= sourceForm.linkText.value;
if (linkText == "") { linkText = "Link Text"; }
var urltext = "";
// 如果此值已设置,将其包含到 URL 中 if (to != "") { urltext += to; } else { alert("Sorry, you must fill out the 'To' field"); sourceForm.to.focus(); return(1); } if (cc != "") { urltext = addDelimiter(urltext); urltext += "CC=" + cc; } if (bcc != "") { urltext = addDelimiter(urltext); urltext += "BCC=" + bcc; } if (subject != "") { urltext = addDelimiter(urltext); urltext += "Subject=" + escape(subject); } if (body != "") { urltext = addDelimiter(urltext); urltext += "Body=" + escape(body); } if (urlType == "url") { urltext = "mailto:" + urltext; } else { urltext = "< A HREF="mailto:" + urltext + "">" + linkText + "< /A>"; }
// 把新的 URL 放到表单域中 targetField.value = urltext;
// 将焦点设置到此域并高亮显示其文本—这样可以方便地剪贴新 URL targetField.focus(); targetField.select(); return(1); }
// 添加 "?" 或 "&" 作为名/值对的分隔符 function addDelimiter(inputString) { var inString = inputString;
// 如果找不到 '?',那么这是第一个名/值对 if (inString.indexOf("?") == -1) { inString += "?"; } // 否则这是随后的名/值对,添加字符 "&" else { inString += "&"; } return inString; }
// 测试 mailto: URL — 将 URL 赋值给文档的 location // 以弹出邮件窗口 function testMailto(loc) { var doc = loc;
// 如果 mailto: URL 嵌入在 anchor 标记中 if (doc.indexOf("HREF=") != -1) { // 从 anchor 标记中抽取 mailto: URL var doc = doc.substring(doc.indexOf("HREF=")+6, doc.indexOf(">")-1); }
// 将 mailto: URL 赋值给文档 (弹出一个邮件窗口) window.location = doc; }
function viewMailto(mailtoText) { alert("URL:nn" + mailtoText); } // --> < /SCRIPT> < /HEAD>
< BODY>
< FONT FACE="Arial, Helvetica" SIZE=-1> < CENTER>< H1>创建 mailto: URL< /H1>< /CENTER>
< FORM NAME="mailtoForm"> < CENTER> < TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffff99" > < TR ALIGN="LEFT" VALIGN="TOP"> < TD COLSPAN="4">< CENTER>< B>< FONT COLOR="#408080" SIZE=+1>在这里输入邮件细节< /FONT> < /B>< /CENTER>< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD>< FONT FACE="Arial, Helvetica" SIZE=-1>< B>To:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="to" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < TD>< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Cc:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="cc" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Bcc:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="bcc" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < TD>< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Subject:< /B>< /TD> < TD>< INPUT TYPE="text" NAME="subject" SIZE=30 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Body:< /B>< /TD> < TD COLSPAN="4">< TEXTAREA NAME="body" WRAP="VIRTUAL" COLS=63 ROWS=3 STYLE="background-color:'#ffcc66'">< /TEXTAREA>< /TD> < /TR> < TR ALIGN="LEFT" VALIGN="TOP"> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>Link Text:< /B>< /TD> < TD COLSPAN="3">< INPUT TYPE="text" NAME="linkText" SIZE=73 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR> < TD COLSPAN="4">< CENTER> < INPUT TYPE="Reset" NAME="Clear" Value="Clear"> < INPUT TYPE="button" NAME="CreateURL" VALUE="Create URL" onClick="createMailto(document.mailtoForm, document.mailtoForm.text, 'url')"> < INPUT TYPE="button" NAME="CreateAnchor" VALUE="Create Link" onClick="createMailto(document.mailtoForm, document.mailtoForm.text, 'anchor')"> < /CENTER>< /TD> < /TR> < TR> < TD COLSPAN="4">< CENTER>< FONT COLOR="#408080" SIZE=+1>< B>这里是你的 mailto: URL< /B> < /FONT>< /CENTER>< /TD> < /TR> < TR> < TD ALIGN="LEFT">< FONT FACE="Arial, Helvetica" SIZE=-1>< B>mailto URL:< /B>< /TD> < TD COLSPAN="3">< INPUT TYPE="text" NAME="text" SIZE=73 STYLE="background-color:'#ffcc66'">< /TD> < /TR> < TR> < TD COLSPAN="4">< CENTER> < INPUT TYPE="button" NAME="Test" VALUE="Test URL" onClick="testMailto(document.mailtoForm.text.value)"> < INPUT TYPE="button" NAME="View" VALUE="View URL" onClick="viewMailto(document.mailtoForm.text.value)"> < /CENTER>< /TD> < /TR> < /TABLE> < /CENTER> < /FORM>
< /FONT>
< /BODY> < /HTML>
正文
生成 mailto: URL 的脚本代码
< HTML> < HEAD> < TITLE>mailto: URL 脚本< /TITLE> < /HEAD>
< BODY> < SCRIPT LANGUAGE="JavaScript"> < !-- // 显示预格式化的信件窗口 function popupMessage() { // 设置信件 var to = "gwok@yeah.net"; var cc = "dehaili@netease.com"; var bcc = "gwok@netease.com"; var subject = "Comments about your tips"; var body = "gwok and dhl," + "nntI'd like to suggest the following improvements to your tips: n" + "nFirst, ..." + "nAlso, sometimes...." + "nnSincerely,nn" + "Your faithful reader...";
// 创建邮件 URL var doc = "mailto:" + to + "?cc=" + cc + "&bcc=" + bcc + "&subject=" + escape(subject) + "&body=" + escape(body);
// 弹出信件 window.location = doc; } // --> < /SCRIPT>
< FORM> < INPUT TYPE="button" NAME="Test" Value="Test mailto: URL" onClick="popupMessage()"> < /FORM>
< /BODY>
< /HTML>
结语
本文中介绍了 JavaScript 的 mailto: URL功能,解释了它的语法以及如何从使用单一的地址属性扩展到使用信件的其它多种属性 (cc、bcc、subject 和 body)。我们准备了一个工具来创建 mailto: URL,以便你能将它复制并粘贴到你的站点页面上。到此你应该学会了如何编写这个工具的 HTML 以及它的脚本。我们还演示了一个脚本,用以生成工具 mailto: URL。你可以使用这两个工具测试 mailto: URLs。第一个提示你填写一个带有所需信息的表单。而在第二个里,你需要一些编程知识以修改脚本来支持你的特定输入。 |
|
asp无组件上传的原理
|
一、无组件上传的原理 我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":
<form method="post" action="upload.asp" enctype="multipart/form-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方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用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 %>
简单起见,上传一个最简单的文本文件(G:\homepage.txt,内容为"宝玉:http://www.webuc.net")来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:
-----------------------------7d429871607fe Content-Disposition: form-data; name="file1"; filename="G:\homepage.txt" Content-Type: text/plain 宝玉:http://www.webuc.net -----------------------------7d429871607fe Content-Disposition: form-data; name="filename" default filename -----------------------------7d429871607fe-- 可以看出来对于表单中的项目,是用过"-----------------------------7d429871607fe"这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息,例如:Content-Disposition: form-data; name="filename",在描述信息中,通过name="filename"可以知道表单项的name。如果有filename="G:\homepage.txt"这样的内容,说明是一个上传的文件,如果是一个上传的文件,那么描述信息会多一行Content-Type: text/plain来描述文件的Content-Type。描述信息和主体信息之间是通过换行来分隔的。
嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的"-----------------------------7d429871607fe")是怎么知道的?每次上传这个边界值是不一样的,还好还好asp中可以通过Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form-data; boundary=---------------------------7d429871607fe",有了这个,我们不仅可以判断客户端的form中有无使用enctype="multipart/form-data"(如果没有使用,那么下面就没必要执行啦),还可以获取边界值boundary=---------------------------7d429871607fe。(注意:这里获取的边界值比上面的边界值开头要少"--",最好补充上。)
至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的函数来分离出来我们想要的数据。
二、分块上传,记录进度 要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那么就表明当前上传了100K。当我提出分块的时候很多人觉得不可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。
写个例子来验证一下分块读取的完整性,在刚才的例子基础上(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
<% Dim biData, PostData, TotalBytes, ChunkBytes ChunkBytes = 1 * 1024 ' 分块大小为1K TotalBytes = Request.TotalBytes ' 总大小 PostData = "" ' 转化为文本类型后的数据 ReadedBytes = 0 ' 初始化为0 ' 分块读取 Do While ReadedBytes < TotalBytes biData = Request.BinaryRead(ChunkBytes) ' 当前块 PostData = PostData & BinaryToString(biData,ChunkBytes) ' 将当前块转化为文本并拼接 ReadedBytes = ReadedBytes + ChunkBytes ' 记录已读大小 If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes Loop Response.Write "<pre>" & PostData & "</pre>" ' 使用pre,原样输出格式 ' 将二进制流转化成文本 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 %>
试验一下上传刚才的文本文件,输出结果证明这样分块读取的内容是完整的,并且在While循环中,我们可以在每次循环时将当前状态记录到Application中,然后我们就可以通过访问该Application动态获取上传进度条。
另:上例中是通过字符串拼接的,如果是要拼接二进制数据,可以通过ADODB.Stream对象的Write方法,示例代码如下:
Set bSourceData = createobject("ADODB.Stream") bSourceData.Open bSourceData.Type = 1 'Binary Do While ReadedBytes < TotalBytes biData = Request.BinaryRead(ChunkBytes) bSourceData.Write biData ' 直接使用write方法将当前文件流写入bSourceData中 ReadedBytes = ReadedBytes + ChunkBytes If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes Application("ReadedBytes") = ReadedBytes Loop
三、保存上传的文件 通过Request.BinaryRead获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:
对于二进制数据,可以直接通过ADODB.Stream对象的SaveToFile方法,将二进制流保存成为文件。 对于文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文件中。 对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于ADODB.Stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对于TextStream对象,可以在文件创建好后,一次Write一部分,分多次Write,这样的好处是不会占用服务器内存空间,结合上面分析的分块获取数据原理,我们可以每获取一块上传数据就将之Write到文件中。我曾做过试验,同样本机上传一个200多MB的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。
四、未解决的难题 我在博客园上看到Bestcomy描述他的Asp.Net上传组件是可以和Sever.SetTimeOut无关的,而在Asp中我是没能做到,对于上传大文件,就只有将Server.SetTimeOut设置为一个很大的值才可以。不知道有没有比较好的解决方法。
如果我们在保存文件时,使用TextStream对象的Write方法,那么如果用户上传时中断了文件传输,已经上传的那部分文件还是在的,如果可以断点续传就好了。关键问题是Request.BinaryRead方法虽然可以分块读取,但是却不能跳过某一段读取!
五、结束语 原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对于每一块获取的数据,要分析是不是属于描述信息,是表单项目还是上传的文件,文件是否已经上传结束……
相信根据上面的描述,您也可以开发出您自己功能强大的无组件上传组件。我想更多的人关心的只是代码,而不会自己动手去写的,也许没有时间,也许水平还不够,更多的只是已经成为了一种习惯……我在CSDN上见过太多技术八股文——一段说明,然后全是代码。授人以鱼不若授人以渔,给你一个代码,也许你并不会去思考为什么,直接拿去用,当下次碰到类似的问题的时候,还是不知道为什么,希望此文能让更多人学到点什么,最重要是"悟"到点什么! |
|
用ASP和VBScript上载文件
|
从浏览器上载文件是从客户机向服务器传递文件的一个简易方法。从第三代浏览器Netscape和 Microsoft起,多数浏览器都可以向服务器上载文件,而不需要向用户提供特殊的访问方式或软件。
一些ASP组件是为文件上载而设计的,例如: Posting Acceptor ( Microsoft SiteServer的一部分), AspSmartUpload(Advantys), AspUpload (PersistsSoftware), SA-FileUpSoftware Artisants)
本文的开始将告诉你关于创建这类组件的信息,而这些组件通常使用VB、C++或Java。
这些组件的问题在于它们是第三方产品而非标准ASP的一部分。作为第三方组件,必须在服务器上进行安装。这就意味着必须在服务器上复制DLL并注册。大多数的主机系统不允许在他们的服务器上进行这样的设置,因为有可能发生配置问题(尤其是虚拟主机)。第二个缺点是它们大部分不是免费的,不提供源代码,也就不能根据需要进行定制。
因此我需要编写VBScript代码来解决文件上载的问题。这不是一个必然的选择,因为VBScript是一种脚本语言,只能使用variants数据类型,并且不能提供许多管理二进制数据和字节数组的内置函数。
要理解上载的过程,首先要知道数据用HTTP协议从浏览器发送到服务器的方式。这就意味着要理解“ multipart/form-data” (多部分/格式-数据)的表单提交。
上载表单
通常情况下,使用HTML表单从浏览器向服务器传递数据。这个表单中可能包含文本域、检验框、按钮以及上载文件的文件类型控制。使用者用自己的数据填充并将这个表提交给服务器。
表单元素中的 enctype 属性规定了传递给服务器的表数据集编码的内容类型。enctype 属性的默认值是“application/x-www-form-urlencoded”,但当向服务器传送大量文本、包含非ASCII字符或二进制数的数据时,这个默认类型就不能胜任了。这时,文件上载提交表单时应使用“multipart/form-data”内容类型。
一个“multipart/form-data”信息包含一系列部件,每个部件都可能包含: 一个Content-Disposition(内容-处理)头,其值为"form-data" ;一个规定控制名的name(名称)属性。
对于一个文件类型控制,一个部件可能包含更多信息: 在客户机上规定原始路径和文件名的filename(文件名)属性;所发送的二进制数据控制的Content-Type (内容-类型)头。
在这些头的后面跟随着控制的二进制或文本内容。
以下例子说明“multipart/form-data”的编码,客户机的浏览器应有这个表单:
如果这个表单被提交,在服务器上可读到这些请求:
-----------------------------7cf87224d2020a Content-Disposition: form-data; name="email" PhCollignon@email.com -----------------------------7cf87224d2020a Content-Disposition: form-data; name="blob"; filename="c:image.gif" Content-Type: image/pjpeg
-----------------------------7cf87224d2020a Content-Disposition: form-data; name="Enter" Submit Query -----------------------------7cf87224d2020a--
当那个内容作为响应被传送回客户机时就会被显示出来。应该用Request.binaryRead 和Response.binaryWrite 方法读和写二进制数据。
〈% Response.BinaryWrite(Request.BinaryRead(Request.TotalBytes)) %〉
可以看到响应的各部分用分界线来划分: -----------------------------7cf87224d2020a 最后一个分界线后面跟随的是’ -- ’ 。
每一个控制都有一个Content-Disposition 。name属性识别由HTML表发送的控制(email、blob和Enter)。 对于一个文件类型控制(blob), 文件名也是Content-Disposition 头的一部分,Content-Type 头给出二进制 数据的内容类型。
上载脚本
上面所有内容都必须经过分解。在VB 或 C++中, 这非常明显,因为为此提供了许多对象和方法。在VBScript 中,必须使用语言所提供的一些函数,并要解决VBScript中使用的双字节编码的变量字符串的问题。
VBScript函数
原始数据是二进制格式,所以必须使用专为管理二进制数据而设计的VBScript函数。因为我们将原始数据作为一个字节的字符串来考虑, 所以 MidB、InstrB 和 LenB 函数就有用了。 但是要避免VBScript的classic字符串,因为它们是双字节编码的字符串,不适宜分解成单字节。
这些是VBScript函数中仅有的用来分解字节的函数。还需要一个方法,从被分解的数据中得到双字节编码的字符串,这样就可以使用VBScript编码中的字符串了。为了在InstrB中把字符串作为一个自变量使用,还需要一个函数,把双字节字符串转换成单字节字符串。
为了我写了两个函数,getString() 和 getByteString(),稍后再对此进行解释。
结构
分解的数据被存储在VBScript Dictionary 对象中。 Dictionary 对象是hash 表对象,它存储(key, item)对。它是VBScript和ASP2.0的一部分。
定义第一个Dictionary 对象 " UploadRequest " 。这个对象包含由上载表提交的所有控制。Key是控制的名字,Item则是对象中所包含的控制的信息: "ControlName1", Dictionary control1 "ControlName2", Dictionary control2
代表一个控制的Dictionary 对象包含着下面的(key, item) 对: "Value", String or binary content "FileName", Name of uploaded file "ContentType", ContentType of uploaded file
把这些结合起来,就有以下例子:
UploadRequest : "email", UploadControl 1 : "Value", PhCollignon@email.com "blob" , UploadControl 2 : "filename", C:/image/file.gif "ContentType" : image/gif "Value" : GIF89ai? 这个对象对于以后存取和使用数据非常有用。
分解
这里是分解、读和记录上载控制的代码。这个过程用"BuildUploadRequest"程序来完成,这个程序只有一个自变量,就是原始二进制数据RequestBin。
Sub BuildUploadRequest(RequestBin)
首先要找到分界线,通过分界线可以知道控制循环何时结束。
’Get the boundary PosBeg = 1 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13))) boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg) boundaryPos = InstrB(1,RequestBin,boundary)
有一个问题是InstrB需要单字节字符串作为自变量。为此写了一个函数:getByteString(String) ,此方法可以把VBScript的双字节字符串转换成单字节字符串。在代码解释的最后再描述这个函数。
在找到结束分界线之前进行下列循环: ’Get all data inside the boundaries Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
循环中的每一步都处理一个控制。有关这一控制的所有数据都保存在dictionary对象中。每一个循环创建一个新的dictionary对象UploadControl。
’Members variable of objects are put in a dictionary object Dim UploadControl Set UploadControl = CreateObject("Scripting.Dictionary")
首先从" Content-Disposition " 头中找到控制的名字。名字的结尾用"字符或chr(34)划分。 ’Get an object name Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition")) Pos = InstrB(Pos,RequestBin,getByteString("name=")) PosBeg = Pos+6 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34))) Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
现在测试控制是文件类控制还是文本类控制。如果是文本类控制,除了它的名字以外没有其它任何数据。 如果是文件类控制,就会得到一些额外信息,如文件名和Content-Type。
PosFile=InstrB(BoundaryPos,RequestBin,getByteString("filename=")) PosBound = InstrB(PosEnd,RequestBin,boundary) ’Test if object is of file type If PosFile〈〉0 AND (PosFile〈PosBound)
Then 如果是控制是文件类控制,就将路径和文件名进行分解,并将他们填加到控制的dictionary 对象中。分解后的文件名是一个单字节字符串,要将它转换成双字节字符串才能作为variant字符串变量使用。这通过最后定义的getString()方法来实现:
’Get Filename, content-type and content of file PosBeg = PosFile + 10 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34))) FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) ’Add filename to dictionary object UploadControl.Add "FileName", FileName Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:")) PosBeg = Pos+14 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13))) ’Add content-type to dictionary object ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType 现在就可以得到文件的核心内容了。这个内容不需要转换,因为它是二进制的。可以将它存入一个文件系统或作为一个二进制长对象(blob)放入数据库中。
’Get content of object PosBeg = PosEnd+4 PosEnd = InstrB(PosBeg,RequestBin,boundary)-2 Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
Else 如果是文本类控制,除了内容以外就没有其它数据需要分解。内容要转换成为双字节字符串,以便将来用 在VBScript代码中。
’Get content of object Pos = InstrB(Pos,RequestBin,getByteString(chr(13))) PosBeg = Pos+4 PosEnd = InstrB(PosBeg,RequestBin,boundary)-2 Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) End If
将内容加入dictionary对象中。将key设置成 " Value ",那么item 就是内容。根据控制类型的不同,内容可以是字符串或二进制数据。
’Add content to dictionary object UploadControl.Add "Value" , Value
最后将控制的dictionary 对象加入一个全程dictionary 对象中。使用的key 是控制的名字。item 是刚刚创建的dictionary对象,名为UploadControl。
’Add dictionary object to main dictionary UploadRequest.Add name, UploadControl ’Loop to next object BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary) Loop End Sub
字节-字符串转换函数
下面是将双字节字符串转换成单字节字符串的函数。
’Byte string to string conversion Function getString(StringBin) getString ="" For intCount = 1 to LenB(StringBin) getString = getString & chr(AscB(MidB(StringBin,intCount,1))) Next End Function 下面是将字符串转换成单字节字符串的函数,它用来格式化InstrB函数的自变量。
’String to byte string conversion Function getByteString(StringStr) For i = 1 to Len(StringStr) char = Mid(StringStr,i,1) getByteString = getByteString & chrB(AscB(char)) Next End Function |
|
关于“狼牙山五壮士”(轉)
|
本人是一个在美国科研单位课文。我的心情可以说是十分悲痛和复杂的。我仅就这作研究的中国学子。无意之间浏览网络的时候知道了上海的语文教材删除了“狼牙山五壮士”的个悲剧谈谈自己的看法。
首先我要讲一个我和“小台 独”之间发生的真实故事。
那是在去年的时候,实验室来了一个台 湾女孩子想在我们这里找一份工作,如果工作有成绩她想读我的导师的研究生。我的导师是个精明强干的美国白人教授。鉴于目前加洲的教育经费十分紧张,研究生的学费都是从老板的研究经费里面支出。所以,老板收学生的原则,就是“不见兔子不撒鹰”。任何一个学生,都要在实验室工作一段时间,老板认为具备科研素养,才会同意招收。于是乎,这个小女孩就被分配给我做助手,暗地里面老板让我考察她的科研能力。和我干了一段时间,我发现那小孩能力一般。属于“托一把就上去,不管她就下来”的家伙,同时,我知道了她是一个坚定的“台 独”。
闲暇的时候,我们也聊天。毕竟,海 峡 两岸,能在美国面对面交流,还是一个难得的机会。我和她都本着心平气和的原则,各抒己见罢了。交流过程中,我发现这个台湾孩子很幼稚――她总是一厢情愿的认为,可以“和 平独 立”。哎,无可救药了。我只能从头给她普及什么叫做“地 缘 政 治”。有一次,晚上做实验,我问她,你会为台 独流尽最后一滴血吗?她说“没那么严重吧”。于是,我就告诉她,我会为祖 国 统 一尽最大努力。她说你会用生命为代价吗?我说,实事求是的说,我并不认为打仗轮的上我,不过,如果我知道我现在在国内的同学在某一天被征召入伍成为了军医,那么,我会抛弃美国的一切回国效力。她问我为什么要看自己的同学,我对她说,如果我的同学――现在在北京大医院工作,能够独当一面的医生们都被征召入伍了,那么,就说明仗打惨了,换言之中华民族到了生死存亡的最后关头,我也就不能呆在美国了。她很惊讶。我很平淡(内 心 骄 傲)的对她说,“我们从小,就是被这样教育的”。于是,我给她讲了黄 继 光,董 存 瑞,邱 少 云,狼 牙 山 五 壮 士。她的眼睛,瞪的好大。后来,我本着平 等的原则,对她说,这些人都是共x 军的英雄,我问你几个人,看看你是否知道。我说了张自忠,高志航,佟灵阁,赵登禹等等很多国民革命军的抗日英雄。令我遗憾的是这个小姑娘一个人也不知道。我很悲哀的看着她说,“如果说共 军的英雄你不知道,那还情有可原,但是国 军英雄,你为什么也不知道?为了民族独 立和尊 严,在关键时刻我们是需要抛头颅撒热血的,我不管你的民主理念,但是,如果你或者你们这个台 独 群体想真的独立,那么,拿出勇气和生命来捍卫自己的理念吧”。
那孩子的反映令我吃惊,她说,这些人你知道,其他中国大陆人未必知道吧?我说,那么,明天白天你可以询问这个实验室所有来自大陆的中国人,如果说有一个人不知道这些英雄,我免费请你一个星期的中午饭。小女孩满认真的,第二天真的去询问了,她询问了八个中国人,就接受了八次英雄主义教育。看着她的失望表情,我决定给她毁灭性的一击,对她说“不要认为战争和英雄仅仅是大陆男人的专利,这里还有不少大陆来的女生吗,为什么不问问她们?”,结果就是她又接受了四次同样的教育。最后的结果就是她没有被录用,我是不会在老板那里给她美言的――不是因为她的台 独理念,而是因为她身上没有让我认可的“坚定”,我看不上那些不能牺牲自己捍卫理念的人。在她临走的时候,她很认真的对我说“我现在知道了,台 湾 独 立仅仅是一个永远不可能实现的梦,因为大陆有一批你们这样的人,科研做的漂亮,同时很勇敢”。
为什么说这个真实的故事,我就是想说――中国不能没有英 雄 主 义。我为什么敢于让她随便询问实验室的中国人?因为我自信,我相信每个中国人,未必有“作 英 雄”的勇气,但是,我知道每个中国人心里面都有英雄,都有血性。可惜,我已经是个三十出头的人,我的实验室的中国同事,也大多是我这个年纪或者更大一点。十年以后,当读着“武侠小说”课本长大的孩子们来到我们实验室求学,我还能有这个自信吗?我还敢让一个台 独分子去向这些不知道五壮士为何物的中国下一代询问中国的英 雄吗?我恐怕不敢了。
这真的让我悲哀。
中国,怎么可以没有英 雄?我们是一个英 雄 辈出的伟大民族。中国的教育,特别是基础教育,怎么可以抛弃英雄主义?难道说,这个世界真的就没有战争,我们的民族真的就没有危机了吗?不是的,恰恰相反,中华民族在我所能预见的未来,还是我们的国歌所唱的“最危险的时候”。人在海外,才更加清楚的认识到了“危机”:四周 列 强林立,祖国还没有统一,我们有什 么理由刀枪入库马放南山?我们有什么理由幼稚的认为,人家不会打我们?难道真的象那个幼稚的小台 独一样,把所谓“独 立”的梦想寄托在对岸“不 动 武”吗??
地球就是这么大,资源就是这么多,空间也就是这么狭小。对于资源,生存空间的竞争也就是对自己民族生存权力的殊死搏斗。难道,我们能够抛弃英雄,阉割掉 民 族 精神中最珍贵的“英 雄主义”然后把我们的生存权力寄托在敌人的“仁慈”上面吗?
写到这里我有些血脉贲张,岁数大了,不想骂街了。还是心平气和的谈谈我对上海修改教科书的看法吧――主要是驳斥那个徐主编的一些观点,还有一些支持删节教科书的人的理由。
1. 所谓“没有共鸣”说。这个观点,及其可笑。师生没有共鸣?责任在老师不在学生。如果说,老师就对于“英雄”没有共鸣,你让孩子们如何取得共鸣呢?孩子都是无瑕的白纸,你要让他们变成什么色彩那就是什么色彩。如果说教师本身就是不务正业,没有爱国之心,报国之志,那么,你能指望你的学生当中出现矢志报国的弟子吗?连堂堂教科书主编,都能够自我 阉 割 掉民族气节,那么基层的老师还能有什么“血 性”呢?如果现在这些读武侠小说课本的孩子们有朝一日成为了教师,那么他们教育出来的学生,能是个什么样子?我不敢想像了。
2. 什么叫做“语文”。中国文章,应该讲究“义理”“考据”“辞章”的――我的语文老师就是这样教育我的。三个关键因素,“义理”排在第一位。文字,永远仅仅是表现形式,形式必须为内容服务。文字,也是人类思想和文明的载体,丧失了内容的载体,就没有存在意义了。抱歉,我是一个“文以载道”的支持者。我认为,文章,必须要有精神内涵。否则,就不成为文章。至于说一段文字,一篇文章的内涵是否被读者接受,那就看这个文章的表现形式是否能够深入人心了。换言之,文字工作者的任务,就是要让读者接受你的“观点”。教科书,更是这样。美好的文字,容易被人接受,但是,如果仅仅是表现形式的美,丧失了文章的“精 气 神”,那么,这样的文章,和太 监们对于主 子的阿 谀奉承,就没有区别了。
3. 什么是英雄?徐主编用几个生活中的个体,来替代五壮士,这是我不能认可的。无论是刘翔,桑兰,还是杨立伟,都不可能具备五壮士的英雄气概。什么叫做“英 雄”什么叫做“勇 敢”?我个人的理解只有“激昂大义,蹈死不顾”的人,才算是英雄。五壮士正是这样的人。在他们上山的时候,作为熟悉地形的战士,他们就知道自己走上了“绝路”,他们面临的只有“被俘”或者“死亡”。他们有没有活路?他们有。但是,为了掩护上级机关,主力部队,还有根据地转移的老百姓,他们选择了牺牲自己。这是真正的英雄。这是历史证明的英雄。无论刘翔,桑兰,还是杨立伟,谁面临这样的“生死抉择”了吗?谁也没有。如果说有,那么敢于和美国佬撞飞机的王伟,倒是一个具有英雄主义的军人。我本人并不否认,刘翔是一个优秀的运动员,他在全世界面前,证实了我们这个“人种”同样具备不亚于其他人种的优秀的体育素质;杨立伟,绝对是一个优秀的军人,我不怀疑他面对敌人的时候同样能够爆发大无畏的崇高品格,之不过航天飞机不是狼牙山的“死地”,默默无闻的工程技术人员是不会把优秀的战士送上绝路的;至于桑兰,怎么说呢?我只能说是意外事故的悲剧牺牲品。“身残志坚”值得称道,但是,不好意思,我见过和桑兰同样身体状况但是比她更“牛”的残疾女性――我生活中的人,所以,桑兰不能打动我。这些被徐主编提出的个体,每个人都有很优秀的地方,但是恕我直言,这些人不算是英雄。这些人不能替代五壮士。从这个意义上说,五壮士是不能被替代的,更不能被删除的。
4. 中国教育,一向是讲究“教书育人”的。育人,是目的;教书,是手段。从古代开始,中国人就讲究“教化”。所谓“教”就是教育;所谓“化”就是通过教育改变被教育的对象。教而不化,就丧失了教育的目的。怎么化?用什么来化?这是教育工作者应该慎重考虑的问题。难道说,用“和孩子们生活脱节”这样的托词就可以恣意阉割我们民族的最可宝贵的英雄主义精神吗?恰恰相反,不但不能阉 割,而是要想办法把英雄精神传成下去。因为教育恰恰是要用优秀的东西来“化”人的。英雄主义就是最优秀的东西之一。就算是语文讲究“美”,那么,五壮士的英雄主义精神难道不“美”吗?红妆少女,玉笏牙板的“杨柳岸晓风残月”是美;难道关西大汉,铜钵铁板的“大江东去”就不是美吗?不要忘了,没有关西大汉舍死戍边,红妆少女恐怕只能是被侵略者蹂躏的牺牲品了。美,需要付出代价,有时候甚至是鲜血和生命的代价。和平很美吧?没有人用生命保卫和平,我们就只能是亡国奴。如果说有人认为敌人刺刀下的“和平”更美,那么,我就无话可说了。
5. 乱谈一些:飞夺泸定桥保留了,五壮士删除了,我不知道这是什么原因。如果说这两篇课文必须删除一篇,那么,我看应该删除前者。也许,因为人在国外接受了 “毒 害”吧,我个人感觉泸定桥打得再英 勇,那也是“内 战”。五壮士则不然,那是面对日本侵 略 者得“民 族 战 争”,任何时候,只要中华民族还存在,“民族英雄”永远是至高无上的。甭跟我说“放在选读课本更合适”――这是自欺欺人的谎言。大家都上过学,对于语文课和选读课哪个学习热情高,是不言而喻的。语文课不学的内容,你指望选读课能让学生记住?那只能是缘木求鱼。编教科书的老师们,教学一线的老师们,你们的任务,不是阉割英 雄主义,而是想办法让学生接受英 雄主义。如果说,你们认为“狼牙山五壮士”这篇课文的行文不够“美”,那么,你们的任务是让文章变的“美起来”,从新写一篇都可以,为什么要删除呢?一篇孕育着无比美好内涵――英 雄 主义的文字,如果从形式上,也就是文章表达方式上变的“不符合时代”欣赏习惯了,那么,教师们应该考虑的是“改变形式”“发扬 精 神”。用这个时代能够接受的表达方式,来继续发扬光大我们民 族最可贵的英 雄 主 义精神。
零七八碎的写这么多,到此打住。作为一个在异国他乡生活多年的中国人,我想我知道祖国多年来对我的教育给予我最宝贵的东西是什么――那就是我们的民 族 精 神,特别是我们民族的英 雄 主义精神。我,恐怕做不了英雄,没有那个素质,但是,我可以保证我自己不做狗熊,更不做汉 奸。我幸运的在童年接受了那些“老掉牙”的故事的教育,知道我们民族有那么多的英雄。今后的孩子们,还有我这样幸运吗?
|
文章收藏 乱闪 发表于 2005/3/28 18:46:22 |
| |
计算机等级考试四级考试中英文术语对照
|
全国计算机等级考试四级考试中英文术语对照中英文术语对照 absence 缺席 access 访问存取通路进入 achieve 实现完成 acquire 获得 adjacency list method 邻接表表示法 adjacency matrix method 邻接矩阵表示法 algorithm 算法 allocate 留下分配 analog 推论 append 添加 archive 档案归档 array 数组 assign 分配 assume 假设 assurance 确信信任 ATM(asynchronous transfer mode) 异步传输模式 b.. real programs kernels 实程序 核心程序 b.. toy benchmark synthetic benchmark 简单基准程序 复合基准程序 balance 平衡 bandwidth 带宽 batch 一批一组 benchmark 基准测试程序 best-fit algorithm 最佳适应算法 BFS(breadth first search) 广度优先搜索法 binary 二进制 binary relation 二元关系 binary tree 二叉树 bit series 比特序列 black-box white-box 黑盒 白盒 block miss 块失效 blocked 阻塞( 等待状态也称阻塞或 封锁状态) boundary 界线分界 bridge 网桥 bubble sort 冒泡排序 calculation 计算 candidate key 候选键(辅键) capability 能力才能 capacity 容量 cartesian product 笛卡尔积 CASE(com.. aided sof.. engineering) 计算机辅助软件工程 CCP(communication control processor) 通信控制处理机 cell 信元 characteristic 特征特性 circuit switching 线路交换 circular wait 循环等待 CISC(complex instruction set computer) 复杂指令集计算机 class 类 Client/Server 客户机/服务器 clock cycle clock rate 时钟周期 时钟频率 coaxial cable 同轴电缆 cohesion coupling 内聚 耦合 coincidental logical procedural functional 偶然内聚 逻辑内聚 过程内聚 功能内聚 combination 联合配合 common 公用的 共同的 communication 通信 complement number 补码 component 成分 concept 概念观念 condition 情况状况 conform 符合 consist 组成存在 constrain 约束 contain 包含 correspond (corresponding) 相符合(相应的 一致的) CPETT 计算机性能评价工具与技术 CPI 每条指令需要的周期数 CSMA/CD 带冲突检测的载波监听多路访问 cursor 游标 cyclic redundency check 循环冗余检校 database: integrity consistency restory 完整性 一致性 可恢复性 database: security efficiency 数据库设计的目标: 安全性 效率 deadlock: mutual exclusion 死锁条件: 互斥 deadlock: circular wait no preemption 死锁条件:循环等待 无优先权 decimal 十进位的 decision 决定判断 decomposition 双重的 混合的 decrease 减少 definition 定义 definition phase 定义阶段 demonstrate 证明 design phase 设计阶段 determine 限定 development phase 开发阶段 DFS(depth first search) 深度优先搜索法 diagram 图表 Difference Manchester 差分曼彻斯特 directed graph undirected graph 有向图 无向图 distinguish 辩认区别 distributed system 分布式系统 divide division 分开除 除法 divide union intersection difference 除 并 交 差 document 文件文档 DQDB(distributed queue dual bus) 分布队列双总线 draw 绘制 dual 二元的 双的 dynamic design process 动态定义过程 element 元素要素 elevator (scan) algorithm 电梯算法 又称扫描算法 encapsulation inheritance 封装( 压缩) 继承( 遗传) encode 译成密码 entity 实体 entity integrity rule 实体完整性规则 equal 相等的 equation 方程式 等式 estimate 估计判断 Ethernet 以太网 evolution 发展演化 exceed 超过 exchange sort 交换排序 exclusive locks 排它锁(简记为X 锁) execute 实现执行 exhibit 表现展示陈列 existence 存在发生 expertise 专门技术 external(internal) fragmentation 外( 内) 碎片 fault page fault 中断 过错 页中断 FDDI(fiber distributed data interface) 光纤分布式数据接口 FDM(frequency division multiplexing 频分多路复用 fiber optic cable 光缆 FIFO replacement policy 先进先出替换算法 figure 数字图形 final 最后的 最终的 first normal form 第一范式 floppy 活动盘片(软盘) foreign key domain tuple 外来键 值域 元组 form 形状形式 formula 公式 表达式 foundation 基础根据基金 frame page frame 帧 结构 页结构 frequency 频率 FTP 文件传送服务 function 函数 functionally dependent 函数依赖 gateway 网间连接器 gather 聚集采集推测 general-purose registers 通用寄存器 generate 产生 grade 等级标准 graph (graphic) 图 Gropher 将用户的请求自动转换成 FTP guarantee 保证确定 hash table hash function collision 哈希表哈希函数( 散列函数)碰撞 HDLC 面向比特型数据链路层协议 hit rate 命中率 host 主计算机 host language statement 主语言语句 hypertext 超级文本 illustrate 举例说明 independent 独立的 index 索引 indirect 间接的 influence 有影响的 initially 最初开头 insertion sort 插入排序 instruction format 指令格式 instruction set 指令集 interface 接口 分界面 连接体 internal 内部的 内在的 interrupt 中断 IPC 工业过程控制 ISAM VSAM 索引顺序存取方法虚拟存储存取方法 join natural join semijoin 连接 自然连接 半连接 judgment 判断 kernel executive supervisor user 核心执行管理用户 kernels 核心程序 key comparison 键(码)值比较 LAN(local area network) 局域网 load 负载载入 logical functional 逻辑内聚 功能内聚 longitudinal 水平的 loop 圈环状 maintain 维护保养供给 maintanence phase 维护( 保养) 阶段 MAN(metropclitan area network) 城域网 Manchester 曼彻斯特 map 地图 映射图 matrix 矩阵点阵 memory reference 存储器参量 message switching 报文交换 method 方法 技巧 MFLOP(million floating point operate p s 每秒百万次浮点运算 minimum 最小的 MIPS(millions of instructions per second 每秒百万条指令 module 单位基准 monitor (model benchmark physcal) method 监视( 模型基准物理)法 multilevel data flow chart 分层数据流图 multiple 复合的 多样的 multiple-term formula 多项式 multiplexing 多路复用技术 multiplication 乘法 mutual exclusion 互相 排斥 non-key attributes 非码属性 null 零空 Nyquist 奈奎斯特 object oriented 对象 趋向的 使适应的 object oriented analysis 面向对象的分析 object oriented databases 面向对象数据库 object oriented design 面向对象的设计 object oriented implementation 面向对象的实现 obtain 获得 occupy 占有 居住于 occurrence 事件 odd 奇数的 one-dimensional array 一维数组 OODB(object oriented data base) 面向对象数据库 OOM(object oriented method) 面向对象的方法 oom: information object message class 信息 对象 消息 类 oom: instance method message passing 实例 方法 消息传递 open system 开放系统 operand 操作数 optimized 尽量充分利用 optional 任选的 非强制的 organize 组织 overflow 溢出 overlapping register windows 重叠寄存器窗口 packet switching 报文分组交换 page fault 页面失效 page replacement algorithm 页替换算法 paged segments 段页式管理 PCB(process control block) 进程控制块 peer entites 对等实体 perform 表演执行 period 时期周期 permit 许可准许 phase 阶段局面状态 physical data link network layer 物理层 数据链路层 网络层 pipeline 管道 platter track cluster 面 磁道 簇 predicate 谓语 preemption 有优先权的 prefix (Polish form) 前缀 (波兰表达式) preorder inorder postorder 前序 中序 后序 presentation application layer 表示层 应用层 primary key attributes 主码属性 principle 原则方法 procedural coincidental 过程内聚 偶然内聚 process 过程加工处理 proficient 精通 program debugging 程序排错 projection selection join 投影选择连接 proposition 主张建议陈述 protocal 协议 prototype 原型样板 prototyping method (model) 原型化周期 (模型) pseudo-code 伪码( 又称程序设计语言PDL) punctuation 标点 purpose 目的意图 quality 质量品质 queue 队列 ready blocked running 就绪 阻塞( 等待) 运行 real page number 实页数 real programs 实程序 redirected 重定向 redundency 冗余 reference integrity rule 引用完整性规则 referred to as 把.....当作 regarde 关于 register(registry) 寄存器 登记 注册 挂号 regularly 定期的 常规的 relation 关系 relay 中继 reliability 可信赖的 repeater 中继器 replacement 替换 represent 代表象征 request indication response confirm 请求 指示 响应 确认 resource 资源 respon 回答响应 RISC(reduced instruction set computer) 精简指令集计算机 robustness 健壮性 router 路由器 scheme 计划图表 sector head cylinder 扇区 磁头 柱面 selection sort 选择排序 semaphores 信号 sequence 序列顺序 Shanon 香农 share locks 共享锁(简记为S 锁) short path critical path 最短路径 关键路径 signal 信号 signal-to-noise ratio 信噪比 B/N similar 相似的 SISD SIMD MISD MIMD * 指令流 * 数据流 SMDS 交换多兆位数据服务 software development phase 软件开发阶段 software engineering 软件工程 software portability 软件可移植性 software requirements specification 软件需求说明书 solve 解决 sort 种类方式分类排序 spanning tree 跨越树 (生成树) specify 指定说明 speedup 加速比 SSTF(shortest-seek-time-first) 最短寻道时间优先( 磁盘调 度算法) stack strategy non-stack strategy 堆栈型 非堆栈型 starvation 饥饿匮乏 statement 陈述 storage 贮藏库 store procdures 存储过程 strategy 战略兵法计划 strict 严密的 styles 文体风格 subgroup 循环的 subset 子集 子设备 superclass subclass abstract class 超类 子类 抽象类 suppose 假定 symbolic 象征的 符号的 synthetic benchmark 复合基准程序 system testing 系统测试 Systolic 脉动阵列 table 表表格桌子 TDM(time division multiplexing) 时分多路复用 technology 工艺技术 terminal 终端 testing phase 测试阶段 theta select project theta join θ选择 投影 θ连接 time complexity 时间复杂度 timestamping 时标技术 Token Bus 令牌总线 Token Ring 令牌环 toy benchmark 简单基准程序 transaction 事务记录 transmite 传送 transport layer session layer 传输层 会话层 traversal method 遍历方法 triggers store procedures 触发器 存储过程 (ORACLE 系统) underflow 下溢 unique 唯一的 unit system acceptance testing 单元测试 系统测试 确认测试 universe 宇宙 全世界 update 更新 value [数]值 variable 变量 vertical 垂直的 vertice edge 顶点( 结点) 边 via 经过 virtual memory system 虚拟存储系统 WAN(wide area network) 广域网 waterfall model 瀑布模型 white noise 白噪声 write-back(copy-back) 写回法 write-through(store-through) 写直达法 WWW(world wide web) 万维网 |
|
Javascrip倒计数文本框演示
|
来源: 未知
作者: RAINMAN_NET
更新日期: [2005-02-23]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312"> <meta http-equiv="Content-type" content="text/html;charset=gb2312" /> <head> <title>No.Javascrip倒计数文本框演示</title> </head> <SCRIPT LANGUAGE="JavaScript"> <!-- var maxLen=500; function checkMaxInput(obj) { if(obj.value.length>maxLen) { obj.value=obj.value.substring(0,maxLen); remLen.innerText="你输入的内容超出了字数限制"; } else { remLen.innerText='还剩下'+(maxLen-obj.value.length)+'字';} } //--> </SCRIPT> <body> <table border="1" width="100%" cellspacing="0" cellpadding="0" bordercolorlight="#000" bgcolor="#808080" height="0"> <tr> <td width="50%"><b><font color="#fff">倒计数文本框</font></b></td> </tr> <tr> <td width="50%" height="110"> <form name="tickform"> <p align="center"> <textarea name="msgbox" rows="5" cols="31" onKeyDown="checkMaxInput(this)" onKeyUp="checkMaxInput(this)" style="background-color:#000;color:#fff;overflow:auto"></textarea> </p> </form> </td> </tr> <tr> <td width="50%"> <font align="right" id="remLen"><b></b></font></td> </tr> </table> </body> </html> |
|
|