热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue+node实现图片上传及预览

先上效果图

先上效果图

vue+node实现图片上传及预览
在这里插入图片描述

上代码

html部分主要是借助了weui的样式

  • ×
发送

重点部分在于

  • ×

通过@change="change"监听图片的上传,把图片转成base64后(后面会讲怎么转base64)将base64的地址加入到images数组,通过v-for="(image,index) in images"把要上传的图片在页面中显示出来,即达到了预览的效果

js部分
data部分

data() { return { content: '',//分享动态的文字内容 maxSize: 10240000 / 2,//图片的最大大小 maxCount: 8,//最大数量 filesArr: [],//保存要上传图片的数组 images: []//转成base64后的图片的数组 } }

delete方法

deleteimg(index) { this.filesArr.splice(index, 1); this.images.splice(index, 1); }

change方法

change(e) { let files = e.target.files; // 如果没有选中文件,直接返回 if (files.length === 0) { return; } if (this.images.length + files.length > this.maxCount) { Toast('最多只能上传' + this.maxCount + '张图片!'); return; } let reader; let file; let images = this.images; for (let i = 0; i self.maxSize) { Toast('图片太大,不允许上传!'); continue; } reader.Onload= (e) => { let img = new Image(); img.Onload= function () { let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); let w = img.width; let h = img.height; // 设置 canvas 的宽度和高度 canvas.width = w; canvas.height = h; ctx.drawImage(img, 0, 0, w, h); let base64 = canvas.toDataURL('image/png'); images.push(base64); }; img.src = e.target.result; }; reader.readAsDataURL(file); } }

put方法把filesArr中保存的图片通过axios发送到后端,注意要设置headers信息

put() { Indicator.open('发布中...'); let self = this; let cOntent= this.content; let param = new FormData(); param.append('content', content); param.append('username', this.userInfo._id); this.filesArr.forEach((file) => { param.append('file2', file); }); self.axios.post('/upload/uploadFile', param, { headers: { "Content-Type": "application/x-www-form-urlencoded" } }).then(function (result) { console.log(result.data); self.$router.push({path: '/home'}); Indicator.close(); Toast(result.data.msg) }) }

后端通过multer模块保存传输的图片,再把保存下来的图片发送到阿里云oss(这个可以根据自己的使用情况变化)

let filePath; let fileName; let Storage = multer.diskStorage({ destination: function (req, file, cb) {//计算图片存放地址 cb(null, './public/img'); }, filename: function (req, file, cb) {//图片文件名 fileName = Date.now() + '_' + parseInt(Math.random() * 1000000) + '.png'; filePath = './public/img/' + fileName; cb(null, fileName) } }); let upload = multer({storage: Storage}).any();//file2表示图片上传文件的key router.post('/uploadFile', function (req, res, next) { upload(req, res, function (err) { let cOntent= req.body.content || ''; let username = req.body.username; let imgs = [];//要保存到数据库的图片地址数组 if (err) { return res.end(err); } if (req.files.length === 0) { new Pyq({ writer: username, content: content }).save().then((result) => { res.json({ result: result, code: '0', msg: '上传成功' }); }) } /*client.delete('public/img/1.png', function (err) { console.log(err) });*/ let i = 0; req.files.forEach((item, index) => { let filePath = `./public/img/${item.filename}`; put(item.filename,filePath,(result)=>{ imgs.push(result.url); i++; if (i === req.files.length) { //forEach循环是同步的,但上传图片是异步的,所以用一个i去标记图片是否全部上传成功 //这时才把数据保存到数据库 new Pyq({ content: content, writer: username, pimg: imgs }).save().then(() => { res.json({ code: '0', msg: '发布成功' }); }) } }) }) }) });

如果你对这个项目有兴趣,你可以去看看我的另一篇文章VueSocial(仿微博、微信的聊天社交平台)

完整在线demo地址 VueSocial(移动端最好使用浏览器打开,pc端按了f12后有个小问题,刷新一下就好,resize触发的问题,待改进)

github地址
如果觉得这篇文章对你有帮助或者觉得这个项目还不错,请留下你的star,谢谢。


推荐阅读
  • 本文探讨了如何在不同域名下,通过浏览器直接下载PDF文件而非预览的问题,并提供了两种解决方案:一是利用原生JavaScript编写下载函数,二是使用第三方库简化下载流程。 ... [详细]
  • BUUCTF [ZJCTF 2019] NiZhuanSiWei 解题报告
    本文详细解析了BUUCTF [ZJCTF 2019] NiZhuanSiWei的解题过程,包括代码审计、PHP伪协议的使用以及反序列化漏洞的利用。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细介绍了如何在Java中实现RSA非对称加密技术,包括生成密钥对、加密和解密操作的具体实现步骤。 ... [详细]
  • 本文针对公司项目中普遍存在的IE浏览器兼容性问题,特别是IE9及以下版本,提出了具体的解决方案,确保用户在这些旧版浏览器中也能顺利实现图片上传预览功能。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 开发笔记:2020 BJDCTF Re encode
    开发笔记:2020 BJDCTF Re encode ... [详细]
  • 深入探讨ASP.NET中的OAuth、JWT与OpenID Connect
    本文作为前文关于OAuth2.0和使用.NET实现OAuth身份验证的补充,详细阐述了OAuth与JWT及OpenID Connect之间的关系和差异,旨在提供更全面的理解。 ... [详细]
  • Vue项目中应用骨架屏实践
    在当前开发的项目中,由于登录过程涉及多次重定向,导致用户体验不佳。为了改善这一状况,本文介绍了如何使用vue-skeleton-webpack-plugin插件在Vue项目中实现骨架屏,以减少用户感受到的白屏时间。 ... [详细]
author-avatar
saanenkim
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有