基于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实现获取当前url地址及url各种参数值
Jun 25 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
PHP排序算法的复习和总结
2012/02/15 PHP
php分页函数完整实例代码
2014/09/22 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python性能优化的20条建议
2014/10/25 Python
Python实现简单字典树的方法
2016/04/29 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
快递业务员岗位职责
2014/01/06 职场文书
抗震救灾标语
2014/06/26 职场文书
党员个人对照检查材料
2014/10/01 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
医院见习总结
2015/06/24 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android