Node.js开发教程之基于OnceIO框架实现文件上传和验证功能


Posted in Javascript onNovember 30, 2016

OnceIO 是 OnceDoc 企业内容(网盘)的底层Web框架,它可以实现模板文件、静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只在第一次压缩),拥有非常好的性能,为您节约服务器成本。它的模块化功能,可以让你的Web进行分布式存储,即一个扩展包里即包含前端、后端和数据库定义,只需通过添加/删除目录的方式就可实现功能删减,实现真正的模块化扩展。这里是介绍如何使用OnceIO的一系列文章。

在这一章节中,我们将为大家演示如何使用 OnceIO 实现文件上传功能。

在网页文件中构建表单

以一个只有文件上传功能的简单网页 file.html 为例:

<!DOCTYPE html>
<html>
<body>
<form method="post" enctype="multipart/form-data" action="/file/upload">
<input type="file" name="file" /><br>
<input type="submit" value="Upload" />
</form>
</body>
</html>

浏览器显示效果是这样的:

Node.js开发教程之基于OnceIO框架实现文件上传和验证功能 

点击空白长条或“浏览…”按钮可以打开文件浏览窗口选择需要上传的文件:

Node.js开发教程之基于OnceIO框架实现文件上传和验证功能 

建立服务器接收文件逻辑

服务器文件 websvr.js 代码是这样的:

var fs = require('fs')
var path = require('path')
var onceio = require('../onceio/onceio')
var app = onceio()
app.get('/', function(req, res){
res.render('file.html')
})
app.file('/file/upload', function(req, res) {
var fileInfo = req.files.file || {}
fs.link(fileInfo.path, path.join('./fileStore', fileInfo.name))
res.send('File Uploaded Successfully')
}).before(function(req, res) {
var contentLength = req.headers['content-length'] || 0
if (contentLength > 1048576) {
res.send({ error: 'Error: File Size Limit (1 MB) Exceeded' })
} else {
return true
}
})

var fs = require('fs') 和 var path = require('path') 分别导入了 Node.js 提供的用于操作文件的文件系统(fs)模块和用于处理文件路径的 path 模块。

app.file(path, callback).before(callback) 相当于 app.use(path, callback, {file: true}).before(callback) ,是一个处理上传的文件的中间件。

文件被上传后,它的大小、存放地址、名称、格式和修改时间五项信息会被放在 req.files 的 file 属性里(名称是 type 为 'file' 的 input 标签中 name 的值),它的尺寸信息会被放在 req.headers 的 content-length 属性里。

before函数

before是OnceIO与其它Web框架的主要区别之一。它可以在文件接收之前就对文件进行一些基本验证,如大小、类型等,以求获得最侍性能。return true 表示验证通并开始接收文件,否则就关闭连接,取消上传。在 before 中,req.session对象是不可用的,因为session可能存在文件或数据库redis中,取得session是一个异步过程需要时间。而before函数需要立刻对文件合法性做出判断。

在这个例子中before回调函数根据 req.headers 中的 content-length 判断上传的文件是否超出了尺寸限制(开发人员可以通过修改 if 语句中的常数改变文件上传尺寸上限,content-length 单位为 byte,1024 * 1024 即代表 1 MB),如果超出了,文件不会被上传,服务器返回错误信息;如果没有超出,函数返回值为 true,服务器继续执行 app.file 中的回调函数,将文件从临时地址转移到指定存储地址,文件上传到这里就完成了。

解决文件重名问题

我们目前的服务器程序是无法解决文件重名问题的。如果用户上传了重名的文件,服务器将会返回文件已经存在的错误。为了解决这个问题,我们可以在文件的主文件名和拓展名之间加入一个时间戳,进行这个处理的函数代码如下:

var timestampName = function(fileName){
// get filename extension
var extName = path.extname(fileName) 
// get base name of the file
var baseName = path.basename(fileName, extName)
// insert timestamp between base name and filename extension
// the plus sign ('+') before new Date() converts it into a number
return baseName + +new Date() + extName
}

再把 fs.link 语句里的 fileInfo.name 替换为 timestampName(fileInfo.name):

fs.link(fileInfo.path, path.join('./fileStore', timestampName(fileInfo.name)))

改进后的服务器程序就能允许用户上传重名文件了,以上传 5 次名为 'cache_workflow.png' 的文件为例,服务器的文件存储地址中会出现 5 个名称都以 'cache_workflow' 开头但时间戳不同的文件:

Node.js开发教程之基于OnceIO框架实现文件上传和验证功能 

OnceIO地址: https://github.com/OnceDoc/onceio

示例源码: https://github.com/OnceDoc/OnceAcademy/tree/master/Lesson14

以上所述是小编给大家介绍的Node.js开发教程之基于OnceIO框架实现文件上传和验证,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
向fckeditor编辑器插入指定代码的方法
May 25 Javascript
JQuery的Validation插件中Remote验证的中文问题
Jul 26 Javascript
PHP开发者必须掌握的6个关键字
Apr 14 Javascript
jquery搜索框效果实现方法
Jan 16 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
jQuery插件扩展操作入门示例
Jan 16 Javascript
JavaScript中的工厂函数(推荐)
Mar 08 Javascript
js实现移动端轮播图
Dec 21 Javascript
富文本编辑器vue2-editor实现全屏功能
May 26 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 Javascript
浅析JavaScript中break、continue和return的区别
Nov 30 #Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 #Javascript
浅析script标签中的defer与async属性
Nov 30 #Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 #Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 #Javascript
html判断当前页面是否在iframe中的实例
Nov 30 #Javascript
vue.js实现表格合并示例代码
Nov 30 #Javascript
You might like
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
PHP chr()函数讲解
2019/02/11 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
js实现简单的打印表格
2020/01/15 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
python实现吃苹果小游戏
2020/03/21 Python
浅谈Python3中print函数的换行
2020/08/05 Python
ORACLE第二个十问
2013/12/14 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
党支部特色活动方案
2014/08/20 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
单位接收函范文
2015/01/30 职场文书
父亲节活动总结
2015/02/12 职场文书
2015年度保密工作总结
2015/04/24 职场文书