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 getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 Javascript
使用js修改客户端注册表的方法
Aug 09 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
JavaScript中的全局对象介绍
Jan 01 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
Mar 09 Javascript
jQuery实现的多屏图像图层切换效果实例
May 07 Javascript
js实现一个链接打开两个链接地址的方法
May 12 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
使用javascript解析二维码的三种方式
Nov 11 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调用Webservice实例代码
2011/07/29 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python同时遍历两个list用法说明
2020/05/02 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
Spy++的使用方法及下载教程
2021/01/29 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
个人充满哲理的自我评价
2014/02/20 职场文书
教师见习报告范文
2014/11/03 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书