基于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中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 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实现一个简单url路由功能实例
2016/11/05 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
日期 时间js控件
2009/05/07 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
全面分析Python的优点和缺点
2018/02/07 Python
python中的json总结
2018/10/11 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
Django实现文件上传和下载功能
2019/10/06 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
委托证明模板
2014/09/16 职场文书
党员个人对照检查材料
2014/10/01 职场文书
律师函格式范本
2015/05/27 职场文书
小组组名及励志口号
2015/12/24 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
Spring实现内置监听器
2021/07/09 Java/Android
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python