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事件列表解说
Dec 22 Javascript
javascript 控制弹出窗口
Apr 10 Javascript
jquery设置元素的readonly和disabled的写法
Sep 22 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
Dec 30 Javascript
JS+HTML5 FileReader对象用法示例
Apr 07 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
js防刷新的倒计时代码 js倒计时代码
Sep 06 Javascript
jQuery简单实现对数组去重及排序操作实例
Oct 31 jQuery
Webpack设置环境变量的一些误区详解
Dec 19 Javascript
ES6 Generator基本使用方法示例
Jun 06 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学习之 循环结构实现代码
2011/06/09 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
PHP静态文件生成类实例
2014/11/29 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
原生js开发的日历插件
2017/02/04 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
Nike香港官网:Nike HK
2019/03/23 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
异地恋情人节寄语
2015/02/28 职场文书
大学生英文求职信范文
2015/03/19 职场文书
目标责任书格式范文
2015/05/11 职场文书
如何书写授权委托书?
2019/06/25 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL