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 相关文章推荐
jQuery filter函数使用方法
May 19 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
Oct 31 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
前端面试知识点目录一览
Apr 15 Javascript
js实现一个简易计算器
Mar 30 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
利用javaScript处理常用事件详解
Apr 14 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 清除网页病毒的方法
2008/12/05 PHP
写出高质量的PHP程序
2012/02/04 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
eclipse php wamp配置教程
2016/06/30 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
javascript控制在光标位置插入文字适合表情的插入
2014/06/09 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python max内置函数详细介绍
2016/11/17 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
简述python Scrapy框架
2020/08/17 Python
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
关于母亲节的感言
2014/02/04 职场文书
电台实习生求职信
2014/02/25 职场文书
地理教师岗位职责
2014/03/16 职场文书
食品安全承诺书
2014/05/22 职场文书
先进工作者申报材料
2014/12/23 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
社区党员干部承诺书
2015/05/04 职场文书
茶花女读书笔记
2015/06/29 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
入党申请书怎么写?
2019/06/11 职场文书
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python