存档

‘杂文’ 分类的存档

预览待上传的本地图片

2009年3月16日 没有评论

预览待上传的本地图片

上传文件是一种很普通的Web应用,尤其以上传图片更为常见。今天我们就在Web标准的范围内谈谈与这个主题相关的内容(只限前端部分,上传的实现当然就不在此列了),关键词是:Javascript、DOM和Firefox。

表单

先创建一个file表单域,我们需要用它来浏览本地文件。

<form name="form1" id="form1" method="post" action="upload.php"> <input type="file" name="file1" id="file1" /> </form>

试下效果:

判断文件类型

当用户选择了一个图片文件时,我们希望他能马上看到这张图片的缩略图,以便他能确认没有把自己的光屁股照片当作头像传到我们的服务器上^_^。

在预览之前我们还得先判断一下用户选择的是不是一个图像文件,如果他想用一个.rar文件做头像的话我们也需要礼貌地提醒一下。

<form name="form2" id="form2" method="post" action="upload.php"> <input type="file" name="file2" id="file2" onchange="preview()" /> </form>

Javascript函数实现,注意我们使用DOM方法getElementById来访问对象。不要再使用form
和input的name属性来访问对象了,只有IE才这么干。

<script type="text/javascript"> function preview2(){ var x = document.getElementById("file2"); if(!x || !x.value) return; if(x.value.indexOf(".jpg")<0 && x.value.indexOf(".jpeg")<0 && x.value.indexOf(".gif")<0){ alert("您选择的似乎不是图像文件。"); }else{ alert("通过"); } } </script>

试下效果:

这里有一个问题,如果用户选择了名为“fake.jpg.txt”的文件,这段脚本仍旧会认为这是一个合法的图像文件。一个可行的解决方案是先 把文件名转换成小写,再取文件路径的最后4到5位,判断一下文件的扩展名是否确为我们支持的图像文件扩展名。不过这种方案略显笨拙,也没有什么美感可言, 我们换一种方案:用“正则表达式”来判断文件扩展名。

<script type="text/javascript"> function preview3(){ var x = document.getElementById("file3"); if(!x || !x.value) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ alert("通过"); }else{ alert("您选择的似乎不是图像文件。"); } } </script>

看看效果(可以自己创建一个“fake.jpg.txt”文件试试):

如果从来没有接触过正则表达式,那这段脚本对你可能会有些晦涩,不妨Google一把,看看是否可以先学习学习这方面的知识。我可以向你保证花四五个小时学点正则表达式会是你最近三个月内作出的最明智选择^_^。

回到这段脚本上来,即使你还看不懂正则表达式那两行,但整段脚本的美感还是很明显的:简洁、直接、语义流畅,这与Web标准关于XHTML的要求是一致的,与Web设计师或开发者天生的“完美”主义也是一致的。

jjww一大段之后,我们转入重点——

预览图片

预览功能的基本设计思路是很清晰的:创建一个img元素,再把文件域的value值赋值给img

元素的src属性。

<form name="form4" id="form4" method="post" action="#"> <input type="file" name="file4" id="file4" onchange="preview4()" /> <img id="pic4" src="" alt="图片在此显示" width="120"/> </form> <script type="text/javascript"> function preview4(){ var x = document.getElementById("file4"); var y = document.getElementById("pic4"); if(!x || !x.value || !y) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ y.src = "file://localhost/" + x.value; }else{ alert("您选择的似乎不是图像文件。"); } } </script>

试下效果:

图片在此显示

如果你用的是Firefox(或Opera),可能会发现什么也没有发生。是的,很不幸Firefox的安全策略不允许我们显示一个用户的本地 图像文件。不知道他们为什么要这么做,我个人觉得图像文件并不会造成严重的安全性问题。即使是不久前比较热门的那个会引起Windows崩溃的jpeg文 件,要显示它的前提条件是用户自己选择了这个文件或者你知道这个文件在用户硬盘上的准确路径。所以我想这种策略很可能来自于一个“懒惰”的开发人员,他并 不想多写一些程序来区分这个本地文件是一个图像文件还是一个恶意文件,Firefox对安全性的要求让他们有些过于敏感了。

让Firefox显示本地文件的唯一办法就是修改它的默认安全策略:

  1. 在Firefox的地址栏中输入“about:config
  2. 继续输入“security.checkloaduri
  3. 双击下面列出来的一行文字,把它的值由true改为false

然后你可以再试试上面预览,everything works well!可惜的是我们并不能要求所有的用户都去修改这个值(更不用说修改的过程还挺麻烦),所以这对我们来说毫无意义。我们能做的也许就是接受Firefox不能预览本地图片这种“可笑”的局面。

用DOM来创建对象

在上面的XHTML代码中,我们为了预览图片,事先加入了一个没有设置src的img对象。除去不美观、代码冗余之外,如果用户浏览器不支持 Javascript,他不仅无法使用这个功能,还要接受页面上一个永远不会显示出来的破图。要解决这个问题,我们就需要在“运行时”再生成这个img对 象,途径还是DOM。

<form name="form5" id="form5" method="post" action="#"> <input type="file" name="file5" id="file5" onchange="preview5()"/> </form> <script type="text/javascript"> function preview5(){ var x = document.getElementById("file5"); if(!x || !x.value) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ var y = document.getElementById("img5"); if(y){ y.src = 'file://localhost/' + x.value; }else{ var img=document.createElement('img'); img.setAttribute('src','file://localhost/'+x.value); img.setAttribute('width','120'); img.setAttribute('height','90'); img.setAttribute('id','img5'); document.getElementById('form5').appendChild(img); } }else{ alert("您选择的似乎不是图像文件。"); } } </script>

试下效果:

这样就相对比较完美了。我也不解释上面这些DOM方法的具体意义,Google一下什么都有了。DOM和正则表达式一样,都是“包你不悔”的实 用技术,如果你希望更多了解、深入学习、或者顺利实践Web标准,DOM是不可或缺的。从我本人最近的体会来说,Javascript+DOM+CSS蕴 藏着强大的能量,就看你怎么释放它了。

分类: javascript, 杂文 标签: ,

Windows下的Memcache安装

2009年3月16日 没有评论

Windows下的Memcache安装
1. 下载memcache(http://jehiah.cz/projects/memcached-win32)的windows稳定版,解压放某个盘下面,比如在c:\memcached
2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装
3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
4.下载php_memcache.dll,请自己查找对应的php版本的文件
5. 在C:\winnt\php.ini 加入一行 ‘extension=php_memcache.dll’
6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!
memcached的基本设置

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

Memcache环境测试
运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把!
< ?php
$mem = new Memcache;
$mem->connect(”127.0.0.1″, 11211);
$mem->set(’key’, ‘This is a test!’, 0, 60);
$val = $mem->get(’key’);
echo $val;
?>

memcached 的工作原理

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

Memcached 本身的启动过程,在 memcached.c 的 main 函数中顺序如下:

1 、调用 settings_init() 设定初始化参数
2 、从启动命令中读取参数来设置 setting 值
3 、设定 LIMIT 参数
4 、开始网络 socket 监听(如果非 socketpath 存在)( 1.2 之后支持 UDP 方式)
5 、检查用户身份( Memcached 不允许 root 身份启动)
6 、如果有 socketpath 存在,开启 UNIX 本地连接(Sock 管道)
7 、如果以 -d 方式启动,创建守护进程(如上调用 daemon 函数)
8 、初始化 item 、 event 、状态信息、 hash 、连接、 slab
9 、如设置中 managed 生效,创建 bucket 数组
10 、检查是否需要锁定内存页
11 、初始化信号、连接、删除队列
12 、如果 daemon 方式,处理进程 ID
13 、event 开始,启动过程结束, main 函数进入循环。

参看网络。

分类: 杂文, 网站建设 标签: ,

Mysql5字符集编码设置问题

2009年2月26日 没有评论

写入数据库后再读取数据库内容,在phpMyAdmin显示正常,运行程序结果为乱码。
修改数据库类增加了mysql_query(“SET NAMES ‘utf-8′”); ,但结果还是这样,
之后发现是mysql的utf-8应该改为utf8,修改执行如下语句解决该问题。
mysql_query(“SET NAMES ‘utf8′”);

分类: 杂文 标签: , ,

UTF-8编码的BOM问题

2009年2月26日 没有评论

php系统的GBK源码转UTF-8之后,程序无法运行,查找后发现是UTF8的BOM签名导致文件多3个字节的问题。

所以之后就寻找清除BOM的方法。确实大多数编辑器都支持这个功能,如EditPlus,UltraEdit,Komodo等,不过效果却有些差异。

感觉最可靠的是komodo另存的文件,转换效果好。EditPlus如果如下文中说的方法设置为“总是删除签名”,保存的文件结尾总会多些字符,反而更麻烦了,大家可以注意下这个问题,不知道是不是我的EditPlus版本问题。

以下是引用的一些详细说明:

产生这个问题通常是在用UTF-8编码进行开发。

·IE里面会发现页面里多了一行空白,而且排除是CSS的原因。
·firefox的firebug插件里看DOM树,会发现HTML多了一行空白,但是在页面样式里面没有影响。
·把页面代码放在UltraEdit下面的十六进制下面看,会发现在空白产生的地方,会有一个“锘?”字符,而本来的”<“符号没了。

要是单个页面的话,就出现在该页面的第一个字符位置。
要是出现在你包含文件的话,那就在该包含文件的第一个字符位置。

———-

说明:
这就是utf-8的签名导致的问题。
UTF- 8签名(UTF-8 signature)也叫做BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记。如果多个文件设置了签名,在二进制流中就会包含多个UTF-8签名,而IE是无法识别多个 UTF-8签名的,所以用一个空行来代替,在某些程序处理中还会出现一个类似“锘?”的字符。

W3C官方的说明: http://www.w3.org/International/questions/qa-utf8-bom

解决办法:

用UltraEdit在十六进制模式下,复制另外的”<“去覆盖掉这个头部的”锘?

并且去掉编辑器里面的BOM签名,以免再次出现。

———————-
具体每种编辑器的话如下所示。

Editplus设置办法如图:

UltraEdit设置办法如图:

Notepad++:

分类: 杂文 标签: ,

人事业失败的一个根本原因,就是精力太分散。

2009年2月23日 没有评论

戴尔.卡耐基在分析众多个人事业失败的案例后得出这样的结论:“人事业失败的一个根本原因,就是精力太分散。”事实的确如此,试想,有一个人,他只有一种技能,但他把自己所有力量都集中于一个毫不动摇的目标上。而另一个人,他很有头脑,但把他的精力分散开来,而且从不知道接下来该做什么。我们断言:前者将会取得更多的成就。
在如今专业化程度越来越高的现代社会,工作对个人的知识和经验不断提出了更高、更广、更深的要求,一个做事时总是摇摆不定、变来变去的人,会将自己长时间积累的职业经验和资源都舍弃了,无法形成自己的核心能力和专业知识,也无法超越他人。也许,一个人刚开始可能确定不了自己的方向,在经过一段时间的模索,必须确定一个自己发展的目标。如果这个目标被证明是正确的,不管遇到什么样的困难,都要坚定不移地为目标而奋斗。

分类: 杂文 标签: ,