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 相关文章推荐
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
Jquery事件的连接使用示例
Jun 18 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
Aug 25 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
jQuery遍历json的方法(推荐)
Jun 12 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 Javascript
vue动态配置模板 'component is'代码
Jul 04 Javascript
使用vue制作滑动标签
Sep 21 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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实现框架(二)
2006/10/09 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
CI框架的安全性分析
2016/05/18 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
JQuery伸缩导航练习示例
2013/11/13 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
python 实时遍历日志文件
2016/04/12 Python
Python变量和字符串详解
2017/04/29 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python中文件的读取和写入操作
2018/04/27 Python
利用python如何处理nc数据详解
2018/05/23 Python
Django之腾讯云短信的实现
2020/06/12 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
jQuery treeview树形结构应用
2021/03/24 jQuery
室内设计专业个人的自我评价
2013/10/19 职场文书
应届生幼儿园求职信
2013/11/12 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
自主实习接收函
2014/01/13 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
餐厅筹备计划书
2014/04/25 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
小学语文业务学习材料
2014/06/02 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
redis 查看所有的key方式
2021/05/07 Redis
MySql新手入门的基本操作汇总
2021/05/13 MySQL
详解Java实践之适配器模式
2021/06/18 Java/Android