nodejs 尾碼名判斷限制代碼

來源:互聯網
上載者:User

現狀: 冗餘
在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
其他常用情境
常量定義
各種有用的工具模組,如字串操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.