nodejs 后缀名判断限制代码


Posted in NodeJs onMarch 31, 2011

现状: 冗余
在web开发中,我们是否常常会使用不同的编程语言实现相同的功能?
如一个文件上传功能,需要对上传文件进行文件格式限制。我们通常会使用后缀名做限制。

前端
为了用户体验,会在页面对用户选择的文件进行判断,合法才让用户可以上传。

function is_filetype(filename, types) { 
types = types.split(','); 
var pattern = '\.('; 
for(var i=0; i<types.length; i++) { 
if(0 != i) { 
pattern += '|'; 
} 
pattern += types[i].trim(); 
} 
pattern += ')$'; 
return new RegExp(pattern, 'i').test(filename); 
}; // 此处省略N行代码 
if(!is_filetype($('#uploadfile').val(), 'doc,pdf,txt,wps,odf,md,png,gif,jpg')){ 
can_submit = false; // 不允许上传 
$('#uploadfile').val(''); 
alert('只允许上传: ' + constant.RESUME_FILETYPES); 
} 
// 此处省略N行代码

后端
由于担心恶意上传,无法避免地需要重新对用户上传的文件进行判断。于是我又用python写了一个判断文件后缀的逻辑
import re def is_filetype(filename, types): 
types = types.split(',') 
pattern = '\.(' + '|'.join([t.strip() for t in types]) + ')$'; 
return re.search(pattern, filename, re.I) != None 
# web request handler 
# 此处省略N行代码

导致这样重复工作的原因是为什么?
1.前端永远不可信;
2.前端和后端使用不同的编程语言;
这样的冗余会带来什么代价?
1.修改业务逻辑,需要重复做2次:如突然发现少支持了 docx 文件类型,需要同时修改javascript代码和python代码
2.增加确保javascript代码和python代码业务逻辑一致的代价。需要分别写2种测试,unit test跑多一倍。
nodejs时代:DRY

Use nodejs no more DRY !

一份代码,前端后端同时运行
// constant.js 
(function(exports){ exports.RESUME_FILETYPES = 'doc,docx,pdf,txt,wps,odf,md,png,gif,jpg'; 
})( (function(){ 
if(typeof exports === 'undefined') { 
window.constant = {}; 
return window.constant; 
} else { 
return exports; 
} 
})() ); 
// util.js 
(function(exports){ 
/** 
* 移除字符串两端的空白字符 
* 
* @return {String} 
* @api public 
*/ 
String.prototype.trim = function(){ 
return this.replace(/(^\s*)|(\s*$)/g, ""); 
}; 
/** 
* 判断是否自定类型的文件 
* 
* @param {String}filename 
* @param {String}types, 多个类型使用,号分隔,如 doc,docx,txt 
* @return {Boolean} true or false 
* @api public 
*/ 
var is_filetype = exports.is_filetype = function(filename, types) { 
types = types.split(','); 
var pattern = '\.('; 
for(var i=0; i<types.length; i++) { 
if(0 != i) { 
pattern += '|'; 
} 
pattern += types[i].trim(); 
} 
pattern += ')$'; 
return new RegExp(pattern, 'i').test(filename); 
}; 
})( (function(){ 
if(typeof exports === 'undefined') { 
window.util = {}; 
return window.util; 
} else { 
return exports; 
} 
})() );

前端
<script src="/js/util.js"></script> 
<script src="/js/constant.js"></script> // 此处省略N行代码 
if(!util.is_filetype($('#uploadfile').val(), constant.RESUME_FILETYPES)){ 
can_submit = false; // 不允许上传 
$('#uploadfile').val(''); 
alert('只允许上传: ' + constant.RESUME_FILETYPES); 
} 
// 此处省略N行代码

后端
var util = require('./public/js/util.js'), 
constant = require('./public/js/constant.js'); 
app.post('/resume/upload/:job_id', function(req, res, next){ 
req.form.complete(function(err, fields, files){ 
if(!util.is_filetype(filepath, constant.RESUME_FILETYPES)) { 
// 由于客户端已做判断,所以这样的情况都是恶意上传的,直接提示 
res.send('文件格式错误: ' + filepath 
+ ' , 请上传' + constant.RESUME_FILETYPES + '格式的文件'); 
return; 
} 
// save file ... 
// 此处省略N行代码 
}); 
});

wow,没冗余了吧!done
其他常用场景
常量定义
各种有用的工具模块,如字符串操作
NodeJs 相关文章推荐
NodeJS url验证(url-valid)的使用方法
Nov 18 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 NodeJs
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 #NodeJs
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 #NodeJs
nodejs实用示例 缩址还原
Dec 28 #NodeJs
NodeJS框架Express的模板视图机制分析
Jul 19 #NodeJs
用nodejs访问ActiveX对象,以操作Access数据库为例。
Dec 15 #NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 #NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 #NodeJs
You might like
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
PHP中,文件上传
2006/12/06 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
php常用数组函数实例小结
2016/12/29 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
《猴子种果树》教学反思
2014/04/26 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
Java版 单机五子棋
2022/05/04 Java/Android