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 相关文章推荐
用nodejs实现PHP的print_r函数代码
Mar 14 NodeJs
NodeJS Express框架中处理404页面一个方式
May 28 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
javascript基础知识
2016/06/07 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
python实现将内容分行输出
2015/11/05 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
Python如何急速下载第三方库详解
2020/11/02 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
天游软件面试
2013/11/23 面试题
财务人员个人自荐信范文
2013/09/26 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
经济贸易系求职信
2014/08/04 职场文书
博士生专家推荐信
2015/03/25 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang