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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
js/jquery判断浏览器的方法小结
Sep 02 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
原生js结合html5制作简易的双色子游戏
Mar 30 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
JS实现在线ps功能详解
Jul 31 Javascript
axios异步提交表单数据的几种方法
Aug 11 Javascript
jquery制作的移动端购物车效果完整示例
Feb 24 jQuery
Javascript实现简易天数计算器
May 18 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
微信支付扫码支付php版
2016/07/22 PHP
php之可变函数的实例详解
2017/09/13 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
php数组遍历类与用法示例
2019/05/24 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python中的localtime()方法使用详解
2015/05/22 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
python实现Zabbix-API监控
2018/09/17 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
使用Tkinter制作信息提示框
2020/02/18 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
比较一下entity bean和session bean
2013/12/27 面试题
时尚休闲吧创业计划书
2014/01/25 职场文书
法人身份证明书
2014/10/08 职场文书
人事文员岗位职责
2015/02/04 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
《日月潭》教学反思
2016/02/20 职场文书
简历自我评价范文
2019/04/24 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL