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服务器(10):处理上传图片
Dec 18 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
python爬虫超时的处理的实例
2018/12/19 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Python中super函数用法实例分析
2019/03/18 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python word转pdf代码实例
2019/08/16 Python
使用K.function()调试keras操作
2020/06/17 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL