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命令行参数处理模块commander使用实例
Sep 17 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
Nodejs处理异常操作示例
Dec 25 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
用Python编写web API的教程
2015/04/30 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python中偏函数用法示例
2018/06/07 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
苹果香港官方商城:Apple香港
2016/09/14 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
路政管理专业推荐信
2013/11/11 职场文书
高中历史教学反思
2014/02/08 职场文书
村创先争优活动总结
2014/08/28 职场文书
家长对孩子的寄语
2015/02/26 职场文书
赢在中国观后感
2015/06/02 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
redis cluster支持pipeline的实现思路
2021/06/23 Redis