Node.js开发教程基于OnceIO框架实现文件上传和验证功能
OnceIO是OnceDoc企业内容(网盘)的底层Web框架,可以实现模板文件和静态文件的全缓存,完全不需要I/O操作,支持客户端缓存优化、GZIP压缩等。(只有第一次压缩),性能非常好,为你节省了服务器成本。它的模块化功能可以让你的Web分布式存储,也就是一个扩展包包含前端、后端和数据库定义,只需要增加/删除目录,就可以删除功能,实现真正的模块化扩展。这里有一系列关于如何使用OnceIO的文章。
在本章中,我们将向您展示如何使用OnceIO上传文件。
在网页文件中构建表单
以一个只有文件上传功能的简单网页file.html为例:
!doctype html bodyformmethod=' post ' enctype=' multipart/form-data ' action='/file/upload ' input type=' file ' name=' file '/br input type=' submit ' value=' upload '/form/body/html浏览器显示效果如下:
单击空白栏或“浏览.”按钮打开文件浏览窗口,选择要上传的文件:
建立服务器接收文件逻辑
服务器文件websvr.js代码如下:
var fs=require(' fs ')var path=require(' path ')var once io=require('./once io/once io ')var app=once io()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('文件上传成功')})。before(function(req,RES){ var content length=req . headers[' content-length ']| | 0if(content length 1048576){ RES . send({ error : ' error : File Size Limit(1mb)overrided ' })} else { return true } })var fs=request(' fs ')和var path=request(' path ')分别导入操作文件的文件系统(fs)模块和处理Node.js提供的文件路径的路径模块。
app.file(路径,回调)。before(回调)相当于app.use(路径,回调,{file: true})。before(回调),这是一个用于处理上传文件的中间件。
文件上传后,其大小、存储地址、名称、格式和修改时间将放在req.files的file属性中(名称是类型为“file”的输入标记中的name值),其大小信息将放在req.headers的content-length属性中
函数之前
以前是OnceIO和其他Web框架的主要区别之一。它可以在接收文件之前对文件进行一些基本的验证,比如大小、类型等。以获得最佳性能。返回true表示验证通过并开始接收文件,否则,关闭连接并取消上传。在以前,req.session对象不可用,因为该会话可能存在于文件或数据库redis中,并且作为异步进程获取该会话需要时间。而before函数需要立即判断文件的合法性。
在本例中,before回调函数根据req.headers中的内容长度判断上传的文件是否超过大小限制(开发者可以通过修改if语句中的常量来改变文件上传大小的上限,内容长度单位为字节,1024 * 1024表示1 MB)。如果是,则不会上传文件,服务器返回错误消息;如果没有超过,则函数返回值为真,服务器继续执行app.file中的回调函数,将文件从临时地址转移到指定的存储地址,这里的文件上传完成。
解决文件名重复的问题
我们目前的服务器程序无法解决文件名重复的问题。如果用户上传同名文件,服务器将返回该文件已经存在的错误。为了解决这个问题,我们可以在文件的主文件名和扩展名之间添加时间戳。该处理的功能代码如下:
var timestampName=function(FIlename){//get FIlename扩展名var extName=path。extName(FIlename)//获取文件的基本名称var baseName=路径。基本名称(文件名,外部名称)//在基本名称和文件扩展名之间插入时间戳//新日期()前的加号(' ')将其转换为数字返回baseName new Date()extName }再把fs.link语句里的文件信息。名称替换为timestampName(fileInfo.name):
fs.link(fileInfo.path,path.join(' ./fileStore ',timestampName(fileInfo.name)))改进后的服务器程序就能允许用户上传重名文件了,以上传5次名为' cache_workflow.png '的文件为例,服务器的文件存储地址中会出现5个名称都以"缓存_工作流"开头但时间戳不同的文件:
OnceIO地址:https://github.com/OnceDoc/onceio
示例源码:https://github.com/once doc/once academy/tree/master/less 14
以上所述是小编给大家介绍的Node.js开发教程之基于OnceIO框架实现文件上传和验证,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
版权声明:Node.js开发教程基于OnceIO框架实现文件上传和验证功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。