基于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获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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递归创建目录的方法
2015/02/02 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
js随机生成一个验证码
2017/06/01 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
python zip文件 压缩
2008/12/24 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
5款非常棒的Python工具
2018/01/05 Python
Windows下python3.6.4安装教程
2018/07/31 Python
分析python请求数据
2018/08/19 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
超市店庆活动方案
2014/08/31 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
大雁塔导游词
2015/02/04 职场文书
红色影片观后感
2015/06/18 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python
关于python类SortedList详解
2021/09/04 Python
分享Python异步爬取知乎热榜
2022/04/12 Python