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对IE操作的经典代码(推荐)
Mar 10 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
Dec 26 Javascript
JQuery动画与特效实例分析
Feb 02 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
Jul 28 Javascript
使用JQuery实现智能表单验证功能
Mar 08 Javascript
微信小程序 教程之列表渲染
Oct 18 Javascript
Ajax实现不刷新取最新商品
Mar 01 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
Vue中的v-for指令不起效果的解决方法
Sep 27 Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 Javascript
Vite + React从零开始搭建一个开源组件库
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
打造计数器DIY三步曲(下)
2006/10/09 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
Web程序工作原理详解
2014/12/25 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
python常用知识梳理(必看篇)
2017/03/23 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
python机器学习之随机森林(七)
2018/03/26 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
人资专员岗位职责
2014/04/04 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
五年级语文教学反思
2016/03/03 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS