欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

node简单实现一个更改头像功能的示例

程序员文章站 2022-12-05 10:15:04
前言 一直想写这篇文章,无奈由于要考试的原因,一直在复习,拖延到现在才写????,之前用 node 的 express 框架写了个小项目,里面有个上传图片的功能...

前言

一直想写这篇文章,无奈由于要考试的原因,一直在复习,拖延到现在才写????,之前用 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);
      });
    }
  });
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。