利用Ajax无刷新上传文件到Node.js服务器

最近做一个垂直社区项目,图片上传是现如今社区的标配,何况面向的还是女性用户。后端使用Node.js,图片上传必然是要不刷新不用iframe了。顺便,也测试了一下Coding.net的“演示”功能,的确是方便免费够用,代码传上去基本零配置就可以跑起来了。这篇文章涉及的代码托管在Coding上,最终的例子也是运行在Coding的免费服务器上。

协议与结构

整个上传采用RFC1867协议,即基于HTML表单的文件上传协议。借助这个协议,为表单增加enctype="multipart/form-data",再使用typefileinput控制来选择文件,然后便可用POST方法上传文件。

文件上传时会分段提交,借助Connect的connect-multiparty模块,即可接收各段组合整理为文件,并将文件存到临时目录,我们可再编写其它代码来处理文件。本例中,我们会把文件复制到public目录,以提供web访问。

整个示例程序包括以下几部分:

  • HTML表单,负责文件的选择
  • JavaScript组织表单数据,执行上传
  • Node.js接受上传的文件,并负责文件的移动和组织

示例程序的代码托管在Coding上的Node.js-Ajax-Upload-File,在线演示地址为node-js-ajax-upload-file.codingapp.com

JavaScript奇技淫巧45招

本文是一篇翻译文章,原文信息如下:

JavaScript是一个绝冠全球的编程语言,可用于Web开发、移动应用开发(PhoneGapAppcelerator)、服务器端开发(Node.jsWakanda)等等。JavaScript还是很多新手踏入编程世界的第一个语言。既可以用来显示浏览器中的简单提示框,也可以通过nodebotnodruino来控制机器人。能够编写结构清晰、性能高效的JavaScript代码的开发人员,现如今已成了招聘市场最受追捧的人。

在这篇文章里,我将分享一些JavaScript的技巧、秘诀和最佳实践,除了少数几个外,不管是浏览器的JavaScript引擎,还是服务器端JavaScript解释器,均适用。

本文中的示例代码,通过了在Google Chrome 30最新版(V8 3.20.17.15)上的测试。

上海昆虫博物馆

远离人群,无论是思想还是身体。这话是没错的,尤其是年轻的人。于是2015年第一天,去上海昆虫博物馆!

这昆虫博物馆,还是非常有来头的。法国神父韩伯禄1868年来到中国,脚跟没稳都开始着手建立博物馆,忙活了十多年,终于在1883年建成了自然博物馆,想想那时开埠也不过几十年,他却想着建立自然博物馆。只可惜,上世纪五十年代这博物馆被拆分,昆虫馆便成了中科院的资产。

期货从业资格考试过关心得及学习资料(视频+音频mp3+PDF)

10月的时候,手头比较闲,网上逛的时候看到以前的考试大改名233网校了,想着闲的没事,于是看了一下考试日历,正好11月16号刚好有个期货从业资格考试,看着正好是不大了解的新鲜玩意儿,便打上计划买书报名准备考试了。运气也还比较好,正好通过了。按照惯例,还是喷一点考试心得,发一些准备资料吧。

使用URL直接激活Bootstrap中的tabbable

Bootstrap中的tabbable的确很好用,但是,tab-content不能直接使用url来定位,只能通过鼠标点击来激活。这成了一个限制,不过通过jquery可以轻松的来使用URL直接定位到tabbable中某个tab-content。

如果要实现通过URL来定位相应的tabbable的内容,那需要改变如下几个内容:

  • 删除现有导航和tab-content中class的active值
  • 为相应的导航控制添加一个active的class值
  • 为相应的tab-content添加一个active的class值
    下面的这个js函数可以实现如上的几个操作:
1
2
3
4
5
6
7
8
9
10
11
12
function navigateToTab() {
var TabId = window.location.hash.replace('#', '');
var isTabExists = ($(".tabbable li:contains('" + $("a[href=#" + TabId + "]").html() + "')").html());
if(TabId && undefined != isTabExists) {
//高亮相关连接
$(".tabbable ul li").removeClass('active');
$(".tabbable li:contains('" + $("a[href=#" + TabId + "]").html() + "')").addClass('active');
//呈现相关内容(tab-content)
$(".tab-content .tab-pane").removeClass('active');
$("#" + TabId).addClass('active');
}
}

将上面的函数,放到通用的js文件中,即可在URL后加#和相应的tab-content id来实现定位了。

更新:代码中增加了判断,只有#后面跟的tab-content id存在的时候,才进行相应的激活操作。

七个习惯助你编写更安全的PHP程序

本文是一篇翻译文章,原文信息如下:

当谈到安全的时候,我们至少要从三方面入手,平台的、系统的,以及你所编写的程序。而在编写PHP程序时,只有做到了以下七个方面,才能算得上保证了安全:

  • 验证输入
  • 保护文件系统
  • 保护数据库
  • 保护会话数据($_SESSION)
  • 防范跨站脚本攻击(XSS)
  • 防范伪造表单
  • 防范CSRF

为ESX上的CentOS添加新硬盘

一台运行在ESX上的CentOS服务器磁盘不够,现需要为其增加硬盘空间。计划新增加一个虚拟硬盘,并使用LVM进行卷管理,挂载到/store。

1、在ESX中增加一块新硬盘

在ESX中找到该虚拟机,在“Edit Setting”中,为其添加一块新硬盘,并记住其“Virtual Device Node”,如“SCSI(0:1)”。

一次Gmail账号被封后解封的经历

计划将一些邮件从现有的Gmail导出,并存储到一个新的Gmail中,于是新申请了账号,但在使用Gmail自带的“导入其它邮箱的邮件和联系人”的功能时,发现Gmail不支持从其它Gmail导入。

为了达到目的,我先利用QQ邮箱的收信功能,将Gmail中的部分邮件先转存到QQ邮箱中,再用Gmail的导入功能进行导入,结果的确也成功了。

但在成功后大约半个小时,我发现我的新Gmail账号已经无法使用,通过Gmail的多账号登录进行切换,密码输入成功后直接跳到一个账号被禁用的提示页面,紧接着,Android手机上也提示输入这个新邮箱的密码,无论输入什么,都提示账号信息错误。