基于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中自定义事件实例
Jun 20 NodeJs
初始Nodejs
Nov 08 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 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 include的妙用,实现路径加密
2008/07/29 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
深入解析php中的foreach函数
2013/08/31 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
Python文件操作基本流程代码实例
2017/12/11 Python
Python 控制终端输出文字的实例
2019/07/12 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
公司开业主持词
2015/07/02 职场文书
大学军训通讯稿
2015/07/18 职场文书
python opencv通过4坐标剪裁图片
2021/06/05 Python
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
swagger如何返回map字段注释
2021/07/03 Java/Android
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis