NodeJS实现图片上传代码(Express)


Posted in NodeJs onJune 30, 2017

文件上传是每个网站不可避免的,最近需要做些上传图片的功能,主要解决两个问题,一个是文件上传样式和服务端路径保存,功能很简单,做起来倒是没那么简单,先从最简单的页面的上传页面的样式开始。

页面样式

Html页面默认的上传的是比较难看的,需要重做一个背景图片,通过背景图片添加上传的图片:

NodeJS实现图片上传代码(Express)

上传图片样式:

<div class="upload-container">

  <input type="file" name="fileToUpload" id="fileToUpload" class="fileupload" />

</div>

CSS样式:

.upload-container {

  background-image: url(../../images/rv/add.jpg);

  background-repeat: no-repeat;

  width: 180px;

  height: 200px;

  padding-bottom: 10px;

  display: inline-block;

  vertical-align: middle;

  .fileupload {

    opacity: 0;

    filter: alpha(opacity=0);

    width: 200px;

    height: 200px;

  }

}

Html点击上传有两种比较常用的方式iFrame上传和Ajax上传,本文采用了Ajax上传是HTML5提出了XMLHttpRequest对象的第二版,传递文件数据主要是通过FormData实现:

$('.fileupload').change(function(event) {

  /* Act on the event */

  if ($('.fileupload').val().length) {

    var fileName = $('.fileupload').val();

    var extension = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase();

    if (extension == ".jpg" || extension == ".png") {

        var data = new FormData();

        data.append('upload', $('#fileToUpload')[0].files[0]);

        $.ajax({

          url: 'apply/upload',

          type: 'POST',

          data: data,

          cache: false,

          contentType: false, //不可缺参数

          processData: false, //不可缺参数

          success: function(data) {

            console.log(data);

          },

          error: function() {

            console.log('error');

          }

        });

    } 

  }

});

服务端保存

NodeJS服务端保存需要使用了第三方插件node-formidable,npm安装地址:

npm install formidable@latest

上传图片

var cacheFolder = 'public/images/uploadcache/';<br>exports.upload = function(req, res) {

  var currentUser = req.session.user;

  var userDirPath =cacheFolder+ currentUser.id;

  if (!fs.existsSync(userDirPath)) {

    fs.mkdirSync(userDirPath);

  }

  var form = new formidable.IncomingForm(); //创建上传表单

  form.encoding = 'utf-8'; //设置编辑

  form.uploadDir = userDirPath; //设置上传目录

  form.keepExtensions = true; //保留后缀

  form.maxFieldsSize = 2 * 1024 * 1024; //文件大小

  form.type = true;

  var displayUrl;

  form.parse(req, function(err, fields, files) {

    if (err) {

      res.send(err);

      return;

    }

    var extName = ''; //后缀名

    switch (files.upload.type) {

      case 'image/pjpeg':

        extName = 'jpg';

        break;

      case 'image/jpeg':

        extName = 'jpg';

        break;

      case 'image/png':

        extName = 'png';

        break;

      case 'image/x-png':

        extName = 'png';

        break;

    }

    if (extName.length === 0) {

      res.send({

        code: 202,

        msg: '只支持png和jpg格式图片'

      });

      return;

    } else {

      var avatarName = '/' + Date.now() + '.' + extName;

      var newPath = form.uploadDir + avatarName;

      displayUrl = UPLOAD_FOLDER + currentUser.id + avatarName;

      fs.renameSync(files.upload.path, newPath); //重命名

      res.send({

        code: 200,

        msg: displayUrl

      });

    }

  });

};

不同用户上传置放在不同的位置,根据需求来设置,当然也有可以每张图片都给不同的id编号,推荐第三方uuid插件:https://github.com/broofa/node-uuid

文件重命名:

fs.renameSync(files.upload.path, newPath); //重命名

文件上传进度:

form.on('progress', function(bytesReceived, bytesExpected) {

});

node-formidable有很多官方API还有很多设置的选项,本文根据需求设置了几项,有额外需求的可以参考官方地址~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
详解nodejs内置模块
May 06 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 #NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 #NodeJs
NodeJS自定义模块写法(详解)
Jun 27 #NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 #NodeJs
NodeJs中express框架的send()方法简介
Jun 20 #NodeJs
深入浅析Nodejs的Http模块
Jun 20 #NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 #NodeJs
You might like
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP引用的调用方法分析
2016/04/25 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python解惑之整数比较详解
2017/04/24 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python如何查看微信消息撤回
2018/11/27 Python
Python发展简史 Python来历
2019/05/14 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
聘任书的写作格式及范文
2014/03/29 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
网站出售协议书范文
2014/10/10 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
初三英语教学计划
2015/01/23 职场文书
教师求职自荐信范文
2015/03/04 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
SQL Server中锁的用法
2022/05/20 SQL Server
React更新渲染原理深入分析
2022/12/24 Javascript