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控件
Mar 27 Javascript
jQuery 幻灯片插件(带缩略图功能)
Jan 24 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
Jun 11 Javascript
js交换排序 冒泡排序算法(Javascript版)
Oct 04 Javascript
浅谈JavaScript字符串拼接
Jun 25 Javascript
JavaScript的面向对象编程基础
Aug 13 Javascript
Javascript数组Array方法解读
Mar 13 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
js生成随机数方法和实例
Jan 17 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
新手简单了解vue
May 29 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 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实现将GB编码转换为UTF8
2006/11/25 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
PHP7新功能总结
2019/04/14 PHP
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
python 文件和路径操作函数小结
2009/11/23 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
详解如何使用Python编写vim插件
2017/11/28 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python查看列的唯一值方法
2018/07/17 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
python连接mongodb集群方法详解
2020/02/13 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
python pymysql库的常用操作
2020/10/16 Python
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
前台文员的岗位职责
2013/11/14 职场文书
总经理检讨书
2014/09/15 职场文书
中小学生学籍证明
2014/10/25 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript