node简单实现一个更改头像功能的示例
2017-12-29 09:46
881 查看
前言
一直想写这篇文章,无奈由于要考试的原因,一直在复习,拖延到现在才写🤣,之前用 node 的 express 框架写了个小项目,里面有个上传图片的功能,这里记录一下如何实现(我使用的是 ejs)📝
思路
首先,当用户点击上传头像,更新头像的时候,将头像上传到项目的一个文件夹里面(我是存放在项目的public/images/img里面),并且将图像名重命名(可以以时间戳来命名)。
同时图片在项目的路径插入到用户表的当前用户的 userpicturepath 里面
然后更新用户的 session,将图片里面的路径赋值给 session 的里面的picture属性里面
<img> 的 src 获取到当前用户的session里面的 picture 的值,最后动态刷新页面头像就换成了用户上传的头像了
实现效果
代码
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); }); } }); });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- node简单实现一个更改头像功能
- Android 框架设计Demo,一个简单的MVP示例搜索功能,网络请求用Retrofit+RxJava实现
- ant design+node.js+mongoose实现一个简单的注册登录功能
- AJAX学习明灯,简单示例:AJAX+存储过程实现无刷新简单登录验证功能!
- Mapxteme 2005 实现GIS 简单的几个功能示例
- 一个简单的struts实现文件上传示例
- Spring+Struts+Hibernate(一个实现用户注册的简单示例)
- 一个较简单的js实现checkbox的全选与全不选功能
- 简单实现一个延时或者计时功能
- [置顶] Skinned Mesh原理解析和一个最简单的实现示例
- Skinned Mesh原理解析和一个最简单的实现示例
- 一个Spring的beanFactory的简单实现示例(传智播客)
- C#摄像头实现拍照功能的简单代码示例
- 分形技术的一个简单示例——雪花图案(AS3实现)
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 我写的一个简单触发器,实现计票功能
- 一个使用监听器模式实现的J2ME网络编程框架,包括一个简单的登录功能实现(含源代码)
- VB.net实现的一个简单的P2P示例
- Remoting的一个代码示例(借助Remoting实现发送信息功能)