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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
提高NodeJS中SSL服务的性能
Jul 15 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
pandas object格式转float64格式的方法
2018/04/10 Python
python 实现矩阵按对角线打印
2019/11/29 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
护士自我鉴定范文
2013/10/06 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
python小程序之飘落的银杏
2021/04/17 Python
MySQL kill不掉线程的原因
2021/05/07 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL