基于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 sublime text 3安装与配置
Jun 19 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
python编程实现希尔排序
2017/04/13 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python提取log文件内容并画出图表
2019/07/08 Python
python 实现让字典的value 成为列表
2019/12/16 Python
通过代码实例了解Python异常本质
2020/09/16 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
迪奥美国官网:Dior美国
2019/12/07 全球购物
中层竞聘演讲稿
2014/01/09 职场文书
医院实习接收函
2014/01/12 职场文书
车队司机自我鉴定
2014/03/02 职场文书
团日活动总结格式
2015/05/11 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
利用python做表格数据处理
2021/04/13 Python
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis