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中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
Nodejs实现用户注册功能
Apr 14 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
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
php读取本地json文件的实例
2018/03/07 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
python使用分治法实现求解最大值的方法
2015/05/12 Python
python实现数据库跨服务器迁移
2018/04/12 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python实现扫描ip地址的小程序
2019/04/16 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
运动会通讯稿50字
2014/01/30 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
组织鉴定材料
2014/06/02 职场文书
对学校的意见和建议
2015/06/04 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
深入理解python多线程编程
2021/04/18 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
MySQL插入数据与查询数据
2022/03/25 MySQL
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python