AjaxFileUpload是一个基于jquery开发的文件上传插件,之前有写过一篇使用方面的文章,颇受欢迎,后因业务需要,需要在一个页面上传多个文件,这才意识到AjaxFileUpload只是支持单文件的,那么改造一下吧,使其支持多文件上传(只做比较简单的示例,您完全可以将其改造得更为强大)。另外对于AjaxFileUpload的基本使用和需要注意的问题请参考文章:jquery插件之AjaxFileUpload

  1. <input id="thumbnail" class="upfileText" name="thumbnail" size="30" type="file" />
  2. <input id="buttonUpload0" class="button" onclick="return ajaxFileUpload(this);" type="button" value="上传" />

做一个“添加”按钮

  1. <div id="add_seriesArea"><input id="add_series" class="button" type="button" value="添加" /></div>

为该按钮绑定click事件:

  1. function add_seriesInit(){
  2.  var thumbStr = '<div class="thumbArea"><label class="label">缩略图片:</label><input id="thumbnail&" name="thumbnail&" class="upfileText" type="file" size="30" /><input id="buttonUpload&" class="button" onclick="return ajaxFileUpload(this);" type="button" value="上传" /></div>';
  3.  
  4. $("#add_series").click(function(){
  5.   series_c++;
  6.   $("#add_seriesArea").before((thumbStr+hoverStr).replace(/&/g,series_c));
  7.  });
  8. };

以上代码中,细心的你应该发现了其实就是通过一个添加按钮来生成多个上传文件的文件选择框和上传按钮,并且将原来的id=“buttonUpload” 和id=“thumbnail”替换成了buttonUpload0 buttonUpload1、thumbnail0、thumbnail1等系列值,为的是id不重复。同样的对ajaxFileUpload执行函数以及后台代码都要作修改。
改进后的php后台代码:

  1. //和作者提供的源代码不同,返回的是一个json格式的消息,SITE_ROOT是全局变量,定义的站点根目录
  2.     $error = "";
  3.     $msg = "";
  4.     //$fileElementName 不再是写死的,需要从前台传入,以区别不同的file对象
  5.     $fileElementName = $_GET["fileElementId"];
  6.     if(!empty($_FILES[$fileElementName]['error']))
  7.     {
  8.         switch($_FILES[$fileElementName]['error'])
  9.         {
  10.             case '1':
  11.                 $error = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
  12.                 break;
  13.             case '2':
  14.                 $error = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
  15.                 break;
  16.             case '3':
  17.                 $error = 'The uploaded file was only partially uploaded';
  18.                 break;
  19.             case '4':
  20.                 $error = 'No file was uploaded.';
  21.                 break;
  22.             case '6':
  23.                 $error = 'Missing a temporary folder';
  24.                 break;
  25.             case '7':
  26.                 $error = 'Failed to write file to disk';
  27.                 break;
  28.             case '8':
  29.                 $error = 'File upload stopped by extension';
  30.                 break;
  31.             case '999':
  32.             default:
  33.                 $error = 'No error code avaiable';
  34.         }
  35.     }
  36.     elseif(empty($_FILES[$fileElementName]['tmp_name']) || $_FILES[$fileElementName]['tmp_name'] == 'none')
  37.     {
  38.         $error = 'No file was uploaded..';
  39.     }
  40.     else
  41.     {
  42.         $dir = SITE_ROOT . "/upload_images/";
  43.         $tstamp = strval(time()).strval(rand(100,999));
  44.         $fname = $tstamp.substr($_FILES[$fileElementName]['name'],strrpos($_FILES[$fileElementName]['name'],"."));
  45.         $msg = $fname;
  46.         $f=$dir.$fname;
  47.         if(strpos($fileElementName,"thumbnail") != false){
  48.             if($_FILES[$fileElementName]['size']/1024 > 100){
  49.                 $msg = $fileElementName."overmaxsize";
  50.             }
  51.         }
  52.         else{
  53.             if(!move_uploaded_file($_FILES[$fileElementName]['tmp_name'],$f))
  54.             {
  55.                 $error = "failed";
  56.                 $msg = "move file failed";
  57.             }
  58.             else{
  59.                 $size = getimagesize($f);
  60.                 $width = $size[0];
  61.                 $height = $size[1];
  62.                 if($width == "" && $height == ""){
  63.                     $error = "failed";
  64.                     $msg = "上传的图片不符合格式要求";
  65.                 }
  66.             }
  67.         }
  68.     }
  69.     echo "{";
  70.     echo                "error: '" . $error . "',\n";
  71.     echo                "msg: '" . $msg . "',\n";
  72.     echo                "width: '" . $width . "',\n";
  73.     echo                "height: '" . $height . "'\n";
  74.     echo "}";

以上就是改造的核心内容,当然,你还可以根据自己的需求随心所欲的加以改变,上面的思路就是参数化写死的变量,多个值换以数组的方式来保存,多文件上传还会遇到一些诸如文件顺序的问题,会使问题复杂化,至于如何处理,主要看需求吧。

一个统计n次命中的脚本

roby on 08月 - 17 - 2009

工作中有一个这样的需求,在一堆01排列的固定长度的数字中找出n次命中即出现n个1的情况,人肉的方式肯定不行,因为排列组合的情况太多了,用正则是当然的,怎么用却一时没想出来,后来翻了grep命令的一些参数后,找到一个方法,算简洁高效:

file=youfile

cat $file| grep -oP “^0{0,20}10{0,20}10{0,20}”

-P代表使用正则,不多说

-o倒是第一次使用,代表输出符合规则的字符流,而不是整行,如“0101001010…” 只会输出前面满足条件的0101

到这里,其实距离目标就只差一点了,再启用一个管道和正则:

| grep -P “\w{22}”

整个脚本的意思便是:选出01文件的固定长度(或起始有用的长度)为22,出现两次1的情况,注意1出现的次数和{0,20}中的20,两者加起来应该是整个长度22

同理,可以完成出现3次,4次,n次1的情况

为了简化正则书写,还可以改写成这样:

cat $file | grep -oP “^0{0,20}(10{0,20}){2}” | grep -P “\w{22}” >targetfile

近期生活小结

roby on 07月 - 27 - 2009

毕业快一月了,新的生活也跟着过了这么长时间。变化还是蛮大的,一开始就买冰箱、洗衣机办上网账号什么的,钱那是花花的流啊。很快就心疼了,加上现在每天都有做饭,对一顿饭的成本有了直接了解,加上口感等缘故,也越来越变得不喜欢吃外面的东西了。最近请饭的机会总是很多,花钱的感觉明显跟以前不一样了,唉,都说毕业前半年攒不下钱,我却貌似很快就变得对钱敏感了,不知是好是坏。

最近最大的好消息莫过于户口接收函终于审批下来了,虽然还有些手续,不过心中悬了大半年的石头终于落地了。小结了一下今年的一些事情,发生在某个有意义的日子的居多啊,愚人节icp终于办下来,恢复了个人网站,儿童节答辩并顺利通过,500年一遇的日全食那天又把户口这悬了许久的事情搞定,下个节日是啥,呵呵,是否可以期待一下呢。

做饭是每天生活的一个主题,现在阿金也成长起来了,厨艺一天天进步啊,他下班早,平时的话基本都是他做了,只有到周末我才为主做做饭,不过周末一般都有同学什么的过来,做大餐还是挺累的。家常的就不算了,煲汤、红烧,这星期还玩起了卤煮,相当不错,牛肉、肥肠、卤蛋,哈哈,好玩又好吃。下一个主题是啥?近期看看美食节目再说吧。

今天比较难过的事情是失去了一位有过好几年交往的朋友,或许由于是异性,又存在一些误解和想法上的巨大差异,以及种种很难说得清的事情和道理,没有办法,试图让每个人都对自己满意,赞不绝口那是非常错误和危险的思路和态度,我只能这样安慰自己了。另外令我感到巨大的不安的是我似乎给人的感觉是所谓的虚伪和暧昧,是以至此,善良似乎找不到空间,反驳和解释都是没有意义的,倒是给我提了一个严重的醒。过去的就只好让它过去了,不论对错是非,唯有祝福!

虽然之前早有准备,但当今天下午得知消息的时候还是几近崩溃,忍住一切,正常上完班回家,正好今天早上下雨,没骑车,于是晚上是走回家的,一路上心里空落落的。“天堂是个更好的地方,节哀顺变,逝者已逝,生者当坚强!”,我是这样回复那位告诉我消息的但我不知道是谁的亲戚的。后来跟爸通电话,知道我回来很困难,才正式上班10多天,没打算告诉我。而我其实是更想跟妈通电话的,只是略一迟疑,我料定妈肯定早就哭得不行了,而我是更怕自己去面对那里的场面的,于是决定不打了。简略的回忆一下我的外公吧,就当生者对逝者,晚辈对长辈的缅怀。

外公是当地方圆百里有名的铁匠,光收的徒弟就有十多个,按每一个需要培养三年以上来算,这段生涯也是三十多年,小时候我就经常和那些徒弟们就常常玩耍。老人家十四岁就开始打铁,到去年身体不适方才放下铁锤,浩浩荡荡六十多年。只是这么长的时间从来没有过任何一个有关职业生涯的庆典之类的活动,更多的是生活的压力,默默的坚守。外公的手艺以快口和外观好看著称,尤其是快口,刀具最擅长,大到一米多的铡刀(就是刘胡兰就义的那种,当然,本地是用来切芦苇的),小到各种管制类匕首(这个得求情才会打的),杀猪用的点血刀,真正的一刀致命,再到各种常用的农具和菜刀。记得其中最关键的一道工序就是“溅火”,通俗的讲就是将通红的刀往水里面放那一下,极其讲究火候和时机,要求对各种不同特性的铁质性能了如指掌,这功夫,徒弟们是看在眼里,但就是学不来。我家炒菜用的锅铲,年纪比我还大,用的菜刀(之前用的那把亦是用了十几年才退休)和各种铁质小工具就连我钓鱼时用来挖蚯蚓的小铲子也是出自外公的铁匠铺。常常会有很多顾客跑几十里地,慕名而来,市里也有好多人托人带菜刀什么的。以我目前的些许生活经验,外公打的菜刀,即便晚年时期的作品,也比超市买的菜刀快了不知几条街。

老家流行在农历五月初五端午节的时候给小孩带一个铁手镯,保平安尤其是防水淹,据说带了铁手镯的人即便掉水里了,也会有水菩萨拖住的。我所有的亲戚几乎都有带,我自然也不例外,记得手镯上写的字是“阿弥陀佛,长命百岁”,周岁的时候带,带到12岁的时候要取掉,我当时调皮,不想取,于是家里就没给取,可是不料,没多久,某天在外玩耍归来,猛然发现就不见了,这事实在是蹊跷。扯远了,那所有的铁手镯便是外公打造的。每年五月初五,外公的铁匠铺真是门庭若市,上香、跪拜、鞭炮、刻字、佩戴、紧固等环节,一个个的来。真是段鲜活而传奇的回忆,可惜不回再有了。

外公好酒,因此逢年过节必定要送酒,晚年以养生的药酒为主,性子比较急,得病后的情绪就一直比较急躁,当时医生就说了是慢性病,不危及生命的。一辈子和铁锤打交道,突然放下并且再也没机会拿起来了,那种感觉无人知道,或许有些人注定就是这样的,条件允许的时候就尽情投入,老了,干不动了,便不安分了,耐不住那样的寂寞和煎熬,快意人生不过如此吧。

如今,外公走了,就像爷爷奶奶去世一样,选择了暑假,而我又再次不在身边,但祖辈那代人,总是能够给我很多思考和珍贵记忆,如今,在成千上万的家庭里用着的都是外公的作品,而且将由那些徒弟们继续发扬下去,一个人若有这样的价值,人生何尝有憾呢。

外公,您一路走好!可以想像,在天堂里,您一定正在温一壶老酒,吆喝三五个徒弟,在火热的铁铺里指挥着各道工序,而在一旁,摆满了一件件闪闪发光的得意作品。

放一些毕业照片

roby on 07月 - 11 - 2009

不知道何种原因,就和本科毕业那样,拍的毕业照好长一段时间都不想碰,今天终于借着上传到Picasa之名,看看了,并找出了当年本科毕业发的那些照片,顺便做了个对比,不多说,看pp吧
在二教前
在二教前
和导师在一起,感谢导师,人非常不错
和导师在一起,感谢导师,人非常不错
令我多少有些尴尬的全家福
令我多少有些尴尬的全家福
宿舍兄弟们
宿舍兄弟们
个人pp一张,特地穿了搜狗的文化衫,代表自己毕业后有个归宿吧
个人pp一张,特地穿了搜狗的文化衫,代表自己毕业后有个归宿吧
研究生毕业时的学子情
研究生毕业时的学子情
本科毕业时的学子情
本科毕业时的学子情

本科照片的发布地址

新的起点,整装待发

roby on 06月 - 8 - 2009

虽未到尘埃落定之时,但也是随波逐流、势不可挡,那么做好准备,整装待发吧。

毕业还剩下二十天左右了,平常工作时间除了必须回来签字办手续交材料啥的,不会请假了,所以晚上和周末的时间得做一些有意义的事情。于是,我有了些计划:

1)不管是全心投入还是装模作样,认真的看看书,内容暂定为linux操作系统相关的吧,一来的确是为将来工作做准备,二来再去去图书馆和二教,权当怀念;

2)来段DV如何?相机视频拍摄效果不错,但一直闲置,不如开发一下,拍摄一些学校和毕业的视频呢,水平虽然料到好不到哪里,但总有个开始才行,周末的时候多行动吧;

3)主动地去追求某女生,尽管目前还是相当的没有自信,且早将自己这方面定性为小学未毕业的水平,豁出去去做吧,特别是要让那该死的理性和面子滚一边去,给自己半年到一年的时间,大家多鼓励我吧,本人第一次这样的表露心机;

4)本来计划要让父母在我临毕业时来北京一趟的,上次电话探了下口风,估计难成行,等到国庆吧,顺便安排去内蒙堂哥那里一趟。

最后,我发现我已经习惯了作计划,按计划办事,答辩完后这几天,除了上班,没给自己设定什么任务,结果有些漫无目的,没过出效率和质量来,于是以后还是坚持多做计划吧。

<更新>

答辩后更新:前两条貌似被我个人主观的夸大了,被重新送审的论文第二天就回来了,且态度180°大转变(其实我没修改什么,附带了一个说明),今天的答辩过程也比较顺利,且把一些疑问都归到了我的陈述表达上(算了,表达不好我也认了,别归在其他方面就好),后面的提问回答大有力挽狂澜之势,另外不厚道的对比了其他同学的,心想应该不至于垫底了吧,囧。剩下的应该就是一些修修补补和材料准备的事情了,算完成一件心头大事。

另外,今天下午,了然打来电话说公司给我准备了生日蛋糕,真是乌龙了一把,本人生日还没到啊,呵呵,不过赶上儿童节,又是答辩刚结束,三喜临门一下吧。不过可惜了蛋糕,今天没去公司,到明天都坏了。。。

明天开始上班,堆积了好些事情了,重新集中精力做好工作上的事情。

稍微有个不好的消息,上了下水木,看到一个帖子,说一个哥们户口复审挂了,一看他的回复,跟我居然同专业!!!。。。这事儿顺其自然吧

</更新>

粗略的回忆了一下我这二十多年的人生,实在是找不出比目前更严峻更令人窒息更接近崩溃的状态了(或许几天后会有),罗列一下造成这种状态的原因:

1.匿名送审有一篇要重审,而且来得比正常状况要晚了一个星期,看了评审意见,更想**,对我的文章有比较深的误解,而提出的修改意见和质疑全都是在他的理解之上的,要迎合他的意见去修改,这几乎意味着我一年多来的思考要重新来一遍。时间相当紧迫,导师让我最好今天就送出,两三天后能返回来,赶上1号的答辩。

2.答辩日期比我预期提前了半个月的样子,程序仍然在白热化状态,且预感有些收不住,怕之前做那么多,然后只能草草收场,再然后自己跌份子,去求检查程序的老师什么的事情发生,第一条的意外更加重了这种可能性。

3.公司的事情给我的压力也达到了去公司后的峰值,且一直在高位运行,最近的突发需求也较多,任何闪失我都得考虑到,负责任,所幸目前没有出什么问题,内容那边习惯性的错误也都被我手工修正过来了,但以后呢,目前的这种状态让我感到有些不稳妥,但又有些无奈。

4.常规压力——户口一丁点儿消息也没有。

5.外公病危,在这种状态下,我不得不还需要做好还可能失去一位至亲,但无法回家的准备。

6.其他的事情已经称不上什么了

失去这些的话,我还有什么?毫无疑问,这种状态是结果导向的,每一个坏的结果足以给我一记重拳,一支刺入我心脏的毒箭。但另我自己都意外的是内心居然还保持着平静,人这个时候是最容易自责和责怪他人的,去怪自己怎么答应做这个连自己都始终觉得不那么顺畅的毕设?怪自己怠慢太久,咎由自取?怪其他人。。。这些都是无意义的了。选择了就要去承担选择所会带来的任何后果,好吧,这些会让我一无所有,让我延期,让我丢掉户口,让我工作上出错甚至丢掉工作,让我再次体会失去至亲的痛,那之后呢?命运,上天,你还能从我这里拿走什么?想再拿走?门都没有!

分析一下上面的事情,有些是我无法改变的,如4和5,剩下的我仍然可以改变,但要完成质的改变,对等所需要付出的代价也可想而知,那么去做吧,一周之后对我的努力和决心见分晓!

categories: php开发

本人的发热报告和三院见闻

roby on 05月 - 17 - 2009

从5月1号开始,本人身体一直有恙,并于昨天(16号)察觉并确认了发热症状,校医院量体温38.5℃,建议我去三院做一下血检,排查一下H1N1的可能性。为了万一确诊的话,不影响他人,决定自己骑车去。本身就四肢无力了,骑过去那叫一个累(更可怕的是回来的时候已经刮大风了,差点没坚持下来)。

到三院快4点了,挂了号测体温,周围都是发热的病人,顿时觉得自己不是那么另类了,比较囧的是第一次由于我自己乱动,体温计没放好,护士看了说“你没烧啊”,我急了:“我真发烧了”。于是让我重测,38.6℃,于是开始做血常规检查。有几项值偏高,但我也看不懂意味着什么,等待大夫的传唤。这个过程中发生了两件事情,一件挺逗,一件挺爆炸性的。挺逗的事情是一哥们坚持怀疑自己的症状和H1N1一样,但大夫说不是,情急之下居然报警了,说大夫的诊断不负责任。警察赶到(天亮请睁眼),不了了之。挺爆炸性的事情是发现了一例**(还是不用疑似好,散布谣言的罪名我承担不起)!!!一位从洛杉矶回来的大爷的症状和血常规结果被怀疑是具有初步的可能性(据护士说该大爷开始并未承认自己是从美国回来的。。。),而我最近的时候离他只有2米远(当然带着口罩)。一会CDC(疾病控制中心)的专家和警察都赶到了,穿着生化服进入了隔离病房,后面的事情我就不知道了,至少今天的新闻媒体还没有相关报道(倒是确认了一例)。

再说说本人接下来的事情,诊断结果为扁桃体发炎(本人声音一直异常了半个月),我想快点好,要求输液治疗,大夫问我对头孢类药物过敏不?我都不知道头孢啥意思,说不知道,让做皮试,但把药全开了,病人在医生面前还能干啥?主动配合呗,这就为后续事情埋下了伏笔。买药共花去46.10(幸好校医院大夫交待三院药贵,能不在那里用药就不用,但三院的规定是第一次输液必须在三院进行。皮试的结果是阳性,不适合使用该药物(大夫说这个要今天第三次阳性了。。。不知道是不是诚心的)。让我换药,口服药。之前的药不退,然后我接着掏钱买新药。我抄~!这是哪门子搞法,不知道先做皮试,通过了再让我买药啊,幸好我坚持只买了第一次用的药,要不亏大发了。后来去拿口服药的时候,我心里就想把我之前买的药拿回来,自己扔了也行。于是去要,护士说不给,振振有词说医疗垃圾不能交给病人,我当时就想补一句“你们真的会当作垃圾处理吗?”,无奈我被折腾得快有气无力了,看那架式也争不会个什么来,甩了个不屑的表情走人。各位看官,提供三个选项,看看哪个可能性更大?

1.进行垃圾处理

2.重新入库

3.护士扣下来,卖个外面的药店

回来后再去了趟校医院报告病情,告诉这边的大夫说我没事,得知我第一次买的药被扣之后,校医院的大夫都忍不住低声骂了两句(还是咱校医院的大夫亲啊)。到今天早晨,量体温,已经正常,扁桃体炎症也有所缓解,但身体还没有完全恢复,这段时间得对自己好点了。

话说久病成医,我分析了一下我这漫长的生病过程,大体是这样的:5月1号放假,当然想休息,一大早起来看火箭的比赛,从床上坐起来,没加衣服,到下午感觉到了感冒的症状,没太当回事,以为睡一觉就好,3,4号的时候加重,嗓子很难受,仔细核对了猪流感的症状,告诉自己说只要发热了我就去医院。那几天一直都在实验室呆着(昨天去医院把笔记本撂实验室才发现那儿的灰尘不是一般的多,实在不是人呆的地方),反而诱发了呼吸道感染。接着还是以为嗓子的事情过个几天应该会好的,但没想一拖就是半个月,并有此引发炎症,引发了发热等症状。而前一段时间工作上的压力也比较大,总之各种不利因素堆积到一起,形成了我这次漫长的生病过程。教训显而易见,希望对各位有帮助

火箭VS湖人II 阿泰赛后言论

roby on 05月 - 7 - 2009

当年我在我家附近打街球的时候,这样的比赛经常会发生,我记得有一次,我的一个朋友在街头打球,他们即将取胜了,比赛进行得非常激烈,对手将一张桌子的一支腿拆了下来,然后插向了他,直接刺穿了他的心脏,他当时就这么死在了球场上,所以说我有打非常粗暴篮球的习惯,然后我进入了联盟,这就是我打球的习惯,我过去经常在球场上打架,这就是我打球的方式,我花了好几年时间才慢慢的摆脱了这种习惯,明白联盟不是这么打球的,联盟是不同的,今年我打的非常堂堂正正,输也输的堂堂正正,赢也赢的堂堂正正,第一次我将胳膊搭在Kobe的身上,你碰触对手,你盯着对手和球都是防守的基础动作,他将我的胳膊打掉,我立刻告诉裁判:看,他打我的胳膊,你不能这么做,你可以碰触对手,盯着球和人,这是防守的基础动作,然后他再一次这么做了,我告诉裁判,你必须要管管了,之后他直接肘击我的脖子,我告诉Kobe,你可以做任何你想做的事,我不会做出回应的,我会让裁判来控制这一切,但是你要我怎么做呢?继续被打?即使在第一场比赛中,他也肘击了Shane,而联盟说他只是想要爬起来而已,但是在第一场中,他明显是对Shane过于的有攻击性了。我们的球队不会像这样做的,我们会堂堂正正的取胜,或者堂堂正正的输,我们不会去打架,我们不会带头挑起任何事端。

纯Admire下,科比再次被我所不齿!

今天迫不及待地等待着比赛的开始,这种感觉和期待的程度,大概只有8年前的五里河之夜可以媲美,光阴荏苒,刚进入大学,姚明也踏入了NBA,如今我要毕业走出校园了,姚明和他的火箭队终于在第五次冲击之后,突破了首轮的桎梏。火箭队的队员,从当初的弗老大、老猫、卡托、泰勒到后来的琼巴里、苏英雄、斯威夫特、韦斯利、麦蒂、霍华德等等到现在的阿泰、小布、斯科拉。人员换了一波又一波,交易或者退役,没有变动的,竟然只有姚明一人从头走到了现在。

第二轮VS湖人,九成我火球迷都不抱希望,但正如杨建所说,如果不经历第二轮,不经历西区决赛,火箭谈何去拿总冠军呢?就像对手开拓者的众球员们,13年来你们首次让这只队伍参加季后赛,只有经历过了,未来才懂得怎样去打这样的比赛。第二轮,在时间允许的情况下,权当欣赏吧,从麦蒂宣布赛季报销的那一刻起,所有的目前都已经实现了,不是么?

不多抒情,如果有筒子想了解更多,去虎扑的火箭专区