基于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 17 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs中实现修改用户路由功能
May 24 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保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
PHP创建XML接口示例
2019/07/04 PHP
javascript中如何处理引号编码"
2013/08/15 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
python字典DICT类型合并详解
2017/08/17 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
详解python数据结构和算法
2019/04/18 Python
python的常见矩阵运算(小结)
2019/08/07 Python
用Python写一个自动木马程序
2019/09/17 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
运动会方队口号
2014/06/07 职场文书
工作检讨书大全
2015/01/26 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL