基于nodejs+express(4.x+)实现文件上传功能


Posted in NodeJs onNovember 23, 2015

Nodejs是一个年轻的编程框架,充满了活力和无限激情,一直都在保持着快速更新。基于Nodejs的官方Web开发库Express也在同步发展着,每年升级一个大版本,甚至对框架底层都做了大手术。在Express4时,替换掉中件间库connect,而改用多个更细粒度的库来取代。带来的好处是明显地,这些中间件能更自由的更新和发布,不会受到Express发布周期的影响;但问题也是很的棘手,不兼容于之前的版本,升级就意味着要修改代码。

通过一段时间的查阅资料、摸索,我发现实现上传的方式有:1.express中间件multer模块(此效率最高,在express3.x原生支持,到了express4.x独立成一个模块了),2.connect-multiparty模块(但现在 官方不推荐 ),3.使用multiparty模块实现(此方法比较普遍),4.使用formidable插件实现(插件呢,就是简单易懂);

最简单的做法是通过“connect-multiparty”中间件实现上传。

通过在项目中npm install connect-multiparty进行安装。

用法:

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.post('/upload', multipartMiddleware, function(req, resp) {
 console.log(req.body, req.files);
 // don't forget to delete all req.files when done 
});

上传后,上传的文件会在临时目录中生成一个临时文件,具体可将req.files打印出查看具体文件路径。

只要在注释的地方将临时文件移动并重命名到实际目录中即可完成上传功能。

简单。

官方地址:https://www.npmjs.com/package/connect-multiparty

但是官方不建议使用该中间件,建议直接使用“multiparty”,因为错误处理比较麻烦。

下面就用“multiparty”实现一个版本。

1.使用express(版本是4.11.x)创建一个项目,采用默认的jade作为模版引擎。

2.在项目目录中,通过npm install multiparty进行安装必要组件。

3.修改views/index.jade,如下做一个简单的用于文件上传的form。

extends layout
  block content                       form(method='post', action='/file/uploading', enctype='multipart/form-data')
    input(name='inputFile', type='file', multiple='mutiple')
    input(name='btnUp', type='submit',value='上传')

 4.修改routes/index.js,实现上传页面和上传响应的后台代码。

var express = require('express');                                                                                                                      
  var router = express.Router();
  var multiparty = require('multiparty');
  var util = require('util');
  var fs = require('fs');
  /* 上传页面 */
  router.get('/', function(req, res, next) {
   res.render('index', { title: 'Express' });
 });
 /* 上传*/
 router.post('/file/uploading', function(req, res, next){
  //生成multiparty对象,并配置上传目标路径
  var form = new multiparty.Form({uploadDir: './public/files/'});
  //上传完成后处理
  form.parse(req, function(err, fields, files) {
   var filesTmp = JSON.stringify(files,null,);
   if(err){
    console.log('parse error: ' + err);
   } else {
    console.log('parse files: ' + filesTmp);
    var inputFile = files.inputFile[];
    var uploadedPath = inputFile.path;
    var dstPath = './public/files/' + inputFile.originalFilename;
    //重命名为真实文件名
    fs.rename(uploadedPath, dstPath, function(err) {
     if(err){
      console.log('rename error: ' + err);
     } else {
      console.log('rename ok');
     }
    });
   }
   res.writeHead(, {'content-type': 'text/plain;charset=utf-'});
   res.write('received upload:\n\n');
   res.end(util.inspect({fields: fields, files: filesTmp}));
  });
 });
 module.exports = router;

完成。基于nodejs+express(4.x+)实现文件上传功能就全部介绍完了,希望对大家学习nodejs express相关知识有所帮助。

NodeJs 相关文章推荐
nodejs中使用monk访问mongodb
Jul 06 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 #NodeJs
Nodejs的express使用教程
Nov 23 #NodeJs
nodejs初步体验篇
Nov 23 #NodeJs
Nodejs初级阶段之express
Nov 23 #NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 #NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 #NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 #NodeJs
You might like
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
php创建类并调用的实例方法
2019/09/25 PHP
推荐20家国外的脚本下载网站
2011/04/28 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
浅析return false的正确使用
2013/11/04 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python合并字符串的3种方法
2015/05/21 Python
超简单的Python HTTP服务
2019/07/22 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
数据库面试要点基本概念
2013/10/31 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
大学生入党思想汇报
2014/01/01 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
大学生读书笔记范文
2015/07/01 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
关于EntityWrapper的in用法
2022/03/22 Java/Android
Echarts如何重新渲染实例详解
2022/05/30 Javascript