nodejs 后缀名判断限制代码-javascript技巧

跟版模板素材网提供nodejs,后缀名,等网页设计素材资源,提供相关网页设计资源的教程和免费下载。跟版网,专业织梦网页设计模板资源站。。
现状: 冗余
在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
其他常用场景
常量定义
各种有用的工具模块,如字符串操作
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

将如下代码加到你网页的头部之间: meta name=viewport content=width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no meta name=apple-mobile-web-app-capable content=yes / meta name=apple-mobile-web-app-statu
遇到网页上有精美图片或者精彩文字想保存时,通常大家都是选中目标后按鼠标右键,在弹出菜单中选择图片另存为或复制来达到我们的目的。但是,目前有许多网页都屏蔽了鼠标右键,那么用js如何实现禁止鼠标右键的功能呢? 1、与禁止鼠标右键相关的JS说明 script
最近遇到一个需求,需要点击按钮,复制 p 标签中的文本到剪切板 之前做过复制输入框的内容,原以为差不多,结果发现根本行不通 尝试了各种办法,最后使了个障眼法,实现了下面的效果 一、原理分析 浏览器提供了 copy 命令 ,可以复制选中的内容 document.exe
这里不能用css样式选择器选择input组件,设置 border:none;或border: 0px;outline:none;cursor: pointer; 亲测没有用处,只有写这种格式时生效,如下: input type=text style=border:none;
String对象的方法 方法一: indexOf() (推荐) var str = 123;console.log(str.indexOf(3) != -1 ); // trueindexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。 方法二: search() var str = 1
在video标签上加个autoplay属性,在PC端浏览器里面运行流畅,但是在手机浏览器里面打开无法播放。原来现在的手机浏览器是不允许网页中视频自动播放的,只有与用户进行了一次交互动作,才可以播放视频。(音频同理) 方案一: 在页面上加一个弹框,用户点击了