node简单实现一个更改头像功能的示例


Posted in Javascript onDecember 29, 2017

前言

一直想写这篇文章,无奈由于要考试的原因,一直在复习,拖延到现在才写?,之前用 node 的 express 框架写了个小项目,里面有个上传图片的功能,这里记录一下如何实现(我使用的是 ejs)?

思路

首先,当用户点击上传头像,更新头像的时候,将头像上传到项目的一个文件夹里面(我是存放在项目的public/images/img里面),并且将图像名重命名(可以以时间戳来命名)。

node简单实现一个更改头像功能的示例

同时图片在项目的路径插入到用户表的当前用户的 userpicturepath 里面

然后更新用户的 session,将图片里面的路径赋值给 session 的里面的picture属性里面

<img> 的 src 获取到当前用户的session里面的 picture 的值,最后动态刷新页面头像就换成了用户上传的头像了

实现效果

node简单实现一个更改头像功能的示例

代码

ejs部分

<img class="nav-user-photo" src="<%= user.picture.replace(/public(\/.*)/, "$1") %>" alt="Photo" style="height: 40px;"/>
<form enctype="multipart/form-data" method="post" name="fileInfo">
  <input type="file" accept="image/png,image/jpg" id="picUpload" name="file">
</form>
<button type="button" class="btn btn-primary" id="modifyPicV">确定</button>

js部分

document.querySelector('#modifyPicV').addEventListener('click', function () {
  let formData = new FormData();
  formData.append("file",$("input[name='file']")[0].files[0]);//把文件对象插到formData对象上
  console.log(formData.get('file'));
  $.ajax({
    url:'/modifyPic',
    type:'post',
    data: formData,
    processData: false, // 不处理数据
    contentType: false,  // 不设置内容类型
    success:function () {
      alert('success');
      location.reload();
    },
  })
});

路由部分,使用formidable,这是一个Node.js模块,用于解析表单数据,尤其是文件上传

let express = require('express');
let router = express.Router();
let fs = require('fs');
let {User} = require('../data/db');
let formidable = require('formidable');
let cacheFolder = 'public/images/';//放置路径
router.post('/modifyPic', function (req, res, next) {
  let userDirPath = cacheFolder + "Img";
  if (!fs.existsSync(userDirPath)) {
    fs.mkdirSync(userDirPath);//创建目录
  }
  let form = new formidable.IncomingForm(); //创建上传表单
  form.encoding = 'utf-8'; //设置编码
  form.uploadDir = userDirPath; //设置上传目录
  form.keepExtensions = true; //保留后缀
  form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
  form.type = true;
  form.parse(req, function (err, fields, files) {
    if (err) {
      return res.json(err);
    }
    let extName = ''; //后缀名
    switch (files.file.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) {
      return res.json({
        msg: '只支持png和jpg格式图片'
      });
    } else {
      let avatarName = '/' + Date.now() + '.' + extName;
      let newPath = form.uploadDir + avatarName;
      fs.renameSync(files.file.path, newPath); //重命名
      console.log(newPath)
      //更新表
      User.update({
        picture: newPath
      }, {
        where: {
          username: req.session.user.username
        }
      }).then(function (data) {
        if (data[0] !== undefined) {
          User.findAll({
            where: {
              username: req.session.user.username
            }
          }).then(function (data) {
            if (data[0] !== undefined) {
              req.session.user.picture = data[0].dataValues.picture;
              res.send(true);
            } else {
              res.send(false);
            }
          })
        }
      }).catch(function (err) {
        console.log(err);
      });
    }
  });
});

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

Javascript 相关文章推荐
jqgrid 表格数据导出实例
Nov 21 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
jQuery中阻止冒泡事件的方法介绍
Apr 12 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
Dec 15 Javascript
jQuery增加自定义函数的方法
Jul 18 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
May 09 Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 Javascript
webpack源码之loader机制详解
Apr 06 Javascript
angularjs的单选框+ng-repeat的实现方法
Sep 12 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
利用 JavaScript 构建命令行应用
Nov 17 Javascript
JavaScript 中使用 Generator的方法
Dec 29 #Javascript
js中url对象化管理分析
Dec 29 #Javascript
JS计算距当前时间的时间差实例
Dec 29 #Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 #Javascript
JS实现简单的浮动碰撞效果示例
Dec 28 #Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
Dec 28 #Javascript
基于substring()和substr()的使用以及区别(实例讲解)
Dec 28 #Javascript
You might like
PHP DataGrid 实现代码
2009/08/12 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
yepnope.js 异步加载资源文件
2011/09/08 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
python避免死锁方法实例分析
2015/06/04 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
Python with标签使用方法解析
2020/01/17 Python
Python绘制组合图的示例
2020/09/18 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
幼儿园教师国培感言
2014/02/02 职场文书
少年闰土教学反思
2014/02/22 职场文书
五五普法心得体会
2014/09/04 职场文书
机关职员工作检讨书
2014/10/23 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
董事长新年致辞
2015/07/29 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers