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 相关文章推荐
javascript 获取网页参数系统
Jul 19 Javascript
Google排名中的10个最著名的 JavaScript库
Apr 27 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
Jun 05 Javascript
纯文字版返回顶端的js代码
Aug 01 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
Feb 03 Javascript
每天一篇javascript学习小结(基础知识)
Nov 10 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
Nov 30 Javascript
Vue DevTools调试工具的使用
Dec 05 Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 Javascript
js模拟F11页面全屏显示
Sep 17 Javascript
redux处理异步action解决方案
Mar 22 Javascript
JS中准确判断变量类型的方法
Jun 01 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者的疑难问答(1)
2006/10/09 PHP
php面向对象的方法重载两种版本比较
2008/09/08 PHP
PHP 危险函数解释 分析
2009/04/22 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
php操作redis缓存方法分享
2015/06/03 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
JavaScript DOM基础
2015/04/13 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
在Django框架中编写Context处理器的方法
2015/07/20 Python
python3 线性回归验证方法
2019/07/09 Python
python实现两个文件夹的同步
2019/08/29 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
django框架中间件原理与用法详解
2019/12/10 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
python 写一个性能测试工具(一)
2020/10/24 Python
zooplus意大利:在线宠物商店
2019/08/07 全球购物
市场营销个人求职信范文
2014/02/02 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
葬礼司仪主持词
2014/03/31 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
人民币使用说明书
2019/04/17 职场文书
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android