欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs 后綴名判斷限制代碼

 更新時間:2011年03月31日 00:58:43   作者:  
如一個文件上傳功能,需要對上傳文件進行文件格式限制。我們通常會使用后綴名做限制。
現狀: 冗余
在web開發(fā)中,我們是否常常會使用不同的編程語言實現相同的功能?
如一個文件上傳功能,需要對上傳文件進行文件格式限制。我們通常會使用后綴名做限制。

前端
為了用戶體驗,會在頁面對用戶選擇的文件進行判斷,合法才讓用戶可以上傳。
復制代碼 代碼如下:

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.修改業(yè)務邏輯,需要重復做2次:如突然發(fā)現少支持了 docx 文件類型,需要同時修改javascript代碼和python代碼
2.增加確保javascript代碼和python代碼業(yè)務邏輯一致的代價。需要分別寫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
其他常用場景
常量定義
各種有用的工具模塊,如字符串操作
您可能感興趣的文章:

相關文章

  • javascript拖拽應用實例

    javascript拖拽應用實例

    這篇文章主要為大家詳細介紹了javascript拖拽應用實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • js判斷兩個數組是否存在相同元素的四種方法

    js判斷兩個數組是否存在相同元素的四種方法

    這篇文章主要給大家介紹了關于js判斷兩個數組是否存在相同元素的四種方法,js中是不能直接用==或者===來計算兩個數組是否相等的,那么就需要對數組的值進行比較,需要的朋友可以參考下
    2023-07-07
  • js實現輪播圖的完整代碼

    js實現輪播圖的完整代碼

    這篇文章主要為大家詳細介紹了js實現輪播圖的完整代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 基于JavaScript實現高德地圖和百度地圖提取行政區(qū)邊界經緯度坐標

    基于JavaScript實現高德地圖和百度地圖提取行政區(qū)邊界經緯度坐標

    本文給大家介紹javascript實現高德地圖和百度地圖提取行政區(qū)邊界經緯度坐標的相關知識,本文實用性非常高,代碼簡單易懂,需要的朋友參考下吧
    2016-01-01
  • 用javascript作一個通用向導說明

    用javascript作一個通用向導說明

    向導可以讓你的網站用戶快速上手使用你的web應用,提高網站的吸引力。向導一般分為好幾個步驟,每個步驟收集一些數據,并且支持退回功能,所有步驟完成后可以得到每一步的收集結果。這里給大家展示一種比較通用,靈活且簡單的向導框架。
    2011-08-08
  • ie與ff下的event事件

    ie與ff下的event事件

    event是ie自帶的一個對象,而ff中不存在該對象,只能通過傳遞參數的方式來模擬event,:(
    2009-09-09
  • js代碼實現點擊按鈕出現60秒倒計時

    js代碼實現點擊按鈕出現60秒倒計時

    這篇文章主要為大家詳細介紹了js代碼實現點擊按鈕出現60秒倒計時,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 微信小程序之圓形進度條實現思路

    微信小程序之圓形進度條實現思路

    這篇文章主要介紹了微信小程序之圓形進度條實現思路,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 使用js獲取url中的參數并返回一個對象方式

    使用js獲取url中的參數并返回一個對象方式

    這篇文章主要介紹了使用js獲取url中的參數并返回一個對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • layer ui 導入文件之前傳入數據的實例

    layer ui 導入文件之前傳入數據的實例

    今天小編就為大家分享一篇layer ui 導入文件之前傳入數據的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09

最新評論