首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【解决方案】ElementUI图片上传前如何对尺寸进行验证并且上传到新浪SCS?

【解决方案】ElementUI图片上传前如何对尺寸进行验证并且上传到新浪SCS?

作者头像
一尾流莺
发布于 2022-12-10 03:09:10
发布于 2022-12-10 03:09:10
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

ElementUI图片上传前对尺寸进行验证的方法

一.ElementUI的upload组件用法

具体的属性可以查看官方文档,这里用到的是:before-upload="beforeAvatarUpload" 这个钩子函数,看名字就知道这是在图片上传前执行的方法,在此可以进行一些验证,官方给出了对图片类型以及大小的验证,接下来将实现对图片尺寸的验证.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="blog-main-views">
    <el-upload
      class="avatar-uploader"
      action="https://jsonplaceholder.typicode.com/posts/"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :before-upload="beforeAvatarUpload">
      <img v-if="imageUrl" :src="imageUrl" class="avatar">
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
  </div>
</template>
 methods: {
    beforeAvatarUpload(file) {
      const isJPG = file.type === 'image/jpeg';
      const isLt2M = file.size / 1024 / 1024 < 2;
      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG 格式!');
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!');
      }
      return isJPG &amp;&amp; isLt2M;
    }
  }
}

这里我们把file参数打印出来看一下

可以看到里面包含了文件名称,大小,类型,但是没有图片的宽高.

要实现对图片宽高的验证,我这里是借助了javascript原生API FileReader

二.javascript原生API FileReader

先来学习一下这个api的使用方法,然后再结合elementUI进行验证

1、FileReader接口的方法

FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取。

  • readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
  • readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
  • readAsDataURL:这个方法将文件读取为一段以data:开头的字符串,这段字符串的实质就是 Data URLData URL是一种将小文件直接嵌入文档的方案。我这里就使用这个方法.

2、FileReader接口事件

FileReader接口包含了一套完整的事件模型,用于捕获读取文件时的状态。

3、FileReader 属性

无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。

4、FileReader 使用

FileReader接口的使用方式非常简单,在不考虑浏览器兼容的情况下直接创建实例就可以了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let reader = new FileReader();

如果考虑浏览器,可以先检查一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(window.FileReader) {
    let reader = new FileReader();
}
else {
    alert("浏览器不支持 换个吧!!");
}

三.ElementUI与FileReader的结合实现验证

既然是获取图片的宽高,那么我这里也是借助了图片来进行验证,既然是图片,我们就要用到FileReader接口的readAsDataURL方法,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
beforeAvatarUpload(file) {
  let reader = new FileReader();
  reader.onload = function () {
    let txt = this.result;
    let img = document.createElement("img");
    img.src = txt;
    img.onload = function () {
      console.log(img.width);
      console.log(img.height);
    }
  };
  reader.readAsDataURL(file);
}

我们通过readAsDataURL获取到的结果,刚好可以赋给img标签作为src属性,然后我们就可以通过最简单的img.width以及img.height来获取宽高了,最后再进行验证就好了

看一下控制台打印结果,编码太长了,主要看一下红色框里的部分.看来获取到宽高是没问题的了

最后我们进行验证,由于FileReader接口的onload方法是异步方法,所以我们是拿不到img属性的,为此我们借助Promise

最后的验证代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
beforeAvatarUpload(file) {
      let _this = this;
      return new Promise(resolve => {
        let reader = new FileReader()
        reader.readAsDataURL(file);
        reader.onload = function () {
          resolve(this.result)
        }
      }).then((result) => {
        document.querySelector("#img").src = result;
        let img = document.querySelector("#img")
        img.onload = function () {
          console.log(img.width)
          console.log(img.height)
          const isWidth = img.width < 500
          const isHeight = img.height < 500
          console.log(isWidth)
          console.log(isHeight)
          if (!isWidth) {
            _this.$message.error('上传头像图片宽度不能超过500!');
          }
          if (!isHeight) {
            _this.$message.error('上传头像图高度不能超过500!');
          }
          return isWidth &amp;&amp; isHeight;
        }
      })
    }

先用一个不符合要求的图片,

换一个符合要求的图片

大功告成,这样就可以在上传图片前进行尺寸验证啦!

验证通过以后自然就是要上传了

基于express图片上传到新浪云

目标功能:图片上传

操作流程:点击上传按钮->把图片上传到服务器->返回图片URL

1.组件中使用elementUI的上传

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<el-upload
      class="avatar-uploader"
      action="http://81.xx.xx.113:3000/blog/uploadArticleImg"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :before-upload="beforeAvatarUpload"
    >
      <img v-if="imageUrl" :src="imageUrl" class="avatar" />
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>

action里面写上传图片的接口

2.配置静态资源文件夹

只有配置了静态资源文件夹才可以使用URL的方式访问图片,这里开放静态资源文件夹一定要在dist前面,不然的话就会走html从而访问不到图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//开放静态资源文件
app.use(express.static(path.join(__dirname, "public")));

// 访问静态资源文件 这里是访问所有dist目录下的静态资源文件
app.use(express.static(path.resolve(__dirname, './dist')));
// 因为是单页应用 所有请求都走/dist/index.html
app.get('*', function(req, res) {
    const html = fs.readFileSync(path.resolve(__dirname, './dist/index.html'), 'utf-8');
    res.send(html);
})

3.上传图片接口

服务器端使用的是multer模块来处理上传的图片,使用post方式,并添加upload.single('file')

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//blog.js

//图片上传模块
const multer = require('multer')
//配置上传路径
const upload = multer({ dest: __dirname + '../../public/uploads' })
//upload.single()表示单个文件的上传 
blog.post('/uploadArticleImg', upload.single('file'), require("./blog/uploadArticleImg"));

但是这个multer模块处理文件有个坑(更可能是我不懂配置),就是它会把上传的文件名更换成随机乱码,并且不会保留后缀,这就导致前端访问的时候直接下载了这个文件,而不是展示图片.为此 ,需要用path模块解析原文件后缀名,然后用fs的方法给文件添加后缀

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//uploadArticleImg.js

//引入path模块
const path = require("path");
//引入fs模块
const fs = require("fs");
module.exports = async(req, res) => {
    //接收文件信息
    const file = req.file;
    //获取原文件名的后缀
    const suffix = path.parse(req.file.originalname).ext;
    //旧的文件名
    const oldname = req.file.path;
    //新的文件名
    const newname = req.file.path + suffix;
    //调用fs.renameSync()方法添加后缀
    fs.renameSync(oldname, newname);
    //获取图片的URL
    file.url = `http://81.70.96.113:3000/uploads/${file.filename}` + suffix;
    //返回文件信息
    res.send(file);
}

到这里就可以正常上传图片,并且返回图片的URL

4.上传图片到新浪云

偶然间发现新浪云可以上传图片用,数据量在一定范围内还是免费的,减少了自己本来就不富裕的服务器内存压力.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * @Description: 图片上传接口
 * @Author: hanzhiwei
 * @Date: 2020-10-07 00:46:47
 * @LastEditTime: 2020-10-13 00:42:41
 * @FilePath: \blog\serve\route\blog\uploadArticleImg.js
 */
//引入path模块
const path = require("path");
//引入fs模块
const fs = require("fs");

//新浪sdk引用
const sinaCloud = require('scs-sdk');
//配置新浪云的accessKey和secretKey  我理解的就是账号密码
const config = new sinaCloud.Config({
    accessKeyId: '2wesaabmtYD4N3SwxkfM',
    secretAccessKey: 'e75005531b2e364d72efb8ee729f0825629a158a',
    sslEnabled: false
});

//实例化新浪云储存
var myBucket = new sinaCloud.S3({ params: { Bucket: 'duwanyu.com' } });
//当前实例生效:
myBucket.config = config;


module.exports = async(req, res) => {
    //接收文件信息
    const file = req.file;
    //获取原文件名的后缀
    const suffix = path.parse(req.file.originalname).ext;
    //旧的文件名(模块生成的乱码)
    const oldname = req.file.path;
    //新的文件名
    const newname = req.file.path + suffix;

    //调用fs.renameSync()方法添加后缀
    fs.renameSync(oldname, newname);
    //获取图片的URL
    // file.url = `http://81.70.96.113:3000/uploads/${file.filename}` + suffix;
    //原文件名(文件本身名字)
    const remoteFilename = req.file.originalname;
    //根据新文件名读取文件
    const fileBuffer = fs.readFileSync(newname);

    //上传文件
    myBucket.putObject({
        ACL: 'public-read', //权限
        Bucket: 'duwanyu.com/images', //上传至duwanyu.com文件夹里的images文件夹里
        Key: remoteFilename, //上传到新浪云的文件名
        Body: fileBuffer //文件
    }, function(error, response) {
        if (error) {
            res.json("上传新浪云失败");
        } else {
            //上传图片成功,将图片地址返回给前端
            file.sinaPath = "http://sinacloud.net/duwanyu.com/images/" + remoteFilename;
            //获取图片的URL
            file.url = `http://81.70.96.113:3000/uploads/${file.filename}` + suffix;
            //返回文件信息
            res.send(file);

        }
    });
}

大功告成,此时新浪云就有我们上传的图片啦!

打个广告

这是我一个开源的收藏网址的项目

项目地址👉👉点击进入,可以直接设置为浏览器主页或者桌面快捷方式进行使用,本人在用,长期维护。

完全开源,大家可以随意研究,二次开发。当然还是十分欢迎大家点个Star⭐⭐⭐ 👉👉源码链接(gitee) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;👉👉源码链接(github)

链接整合

🔊项目预览地址(GitHub Pages):👉👉https://alanhzw.github.io

🔊项目预览备用地址(自己的服务器):👉👉http://warbler.duwanyu.com

🔊源码地址(gitee):👉👉https://gitee.com/hzw_0174/warbler-homepage

🔊源码地址(github):👉👉https://github.com/alanhzw/WarblerHomepage

🔊我的博客:👉👉https://www.duwanyu.com

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL一主多从复制(基于GTID)
Mysql主从同步时Slave_IO_Running:Connecting ; Slave_SQL_Running:Yes的情况故障排除
嘉美伯爵
2021/01/18
9010
MySQL5.7主从同步--点位方式及GTID方式
MySQL5.6加入了GTID的新特性,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog。主从同步时GTID_Event和事务的Binlog都会传递到从库,从库在执行的时候也是用同样的GTID写binlog,这样主从同步以后,就可通过GTID确定从库同步到的位置了。也就是说,无论是级联情况,还是一主多从情况,都可以通过GTID自动找到需要进行复制的点位,而无需像之前版本那样通过File_name和File_position来进行位置点的主从复制。
俊才
2019/08/07
2.5K0
MySQL5.7主从同步--点位方式及GTID方式
MySQL一主多从复制(基于GTID)
mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p > all.sql
嘉美伯爵
2021/01/05
8820
MySQL备份与恢复(二)
前天的文章中简单写了备份与恢复的方法,今天我们主要来看看不同的备份方法备份出来的文件结果,以及它们的恢复方法。
AsiaYe
2019/11/06
8930
MySQL5.7升级到8.0过程详解
不知不觉,MySQL8.0已经发布好多个GA小版本了。目前互联网上也有很多关于MySQL8.0的内容了,MySQL8.0版本基本已到稳定期,相信很多小伙伴已经在接触8.0了。本篇文章主要介绍从5.7升级到8.0版本的过程及注意事项,有想做版本升级的小伙伴可以参考下。
MySQL技术
2020/05/26
6.7K0
关于 MySQL异步复制
Replication,复制是高可用的基础,MHA、mycat等中间件的底层都依赖复制原理
星哥玩云
2022/08/18
6220
关于 MySQL异步复制
MySQL从删库到恢复,还用跑路吗?
误删数据库应该如何恢复操作?怎样才能做好数据库的备份、恢复、容灾、HA?如果你身处数据库行业,最近可能会比较关注这几个问题
搜云库技术团队
2019/10/17
1.4K0
MySQL 管理
-e选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。
用户9615083
2022/12/25
1.4K0
MySQL 管理
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
今天分享一期 mysql中 备份之后发生灾难造成数据丢失 那么如何恢复中间的数据呢?
神秘泣男子
2024/06/03
4080
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
故障分析 | MySQL5.7 使用 mysqldump 重要闭坑事项
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。擅长数据库故障处理。对数据库技术和 python 有着浓厚的兴趣。
jeanron100
2020/11/17
1.1K0
Linux下Mysql数据库的基础操作
Mysql数据库是一种关系型数据库管理系统,具有的优点有体积小、速度快、总体成本低,开源,可移植性(跨平台,在不同系统中使用),可以和开发语结合,属于轻量级数据库。
江湖有缘
2023/11/11
4710
MySQL通过 XtraBackup 备份恢复单个库
本文通过 XtraBackup 备份单个数据库,然后恢复到另一个实例,用于快速迁移大数据量,使用的软件版本为:
GreatSQL社区
2023/02/22
2.5K0
技术分享 | MariaDB 10.1.9 迁移到 MySQL 5.7.25
爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查,对数据库有兴趣,对技术有想法。一入 IT 深似海,从此节操是路人。
爱可生开源社区
2020/06/12
2.1K0
技术分享 | MariaDB 10.1.9 迁移到 MySQL 5.7.25
mysql基本操作以及python控制mysql(2)–mysql基础操作
学习了http://www.cnblogs.com/fnng/p/3565912.html
十四君
2019/11/28
8140
linux下Mysql的简单操作
退出的话,直接输入quit或者exit即可。细心的读者也许会发现,在上一条命令中,使用的是绝对路径,这样不方便,但是单独只是输入一个 “mysql” 命令是不行的,因为 “/usr/local/mysql/bin” 没有在 PATH 这个环境变量里。如何把它加入环境变量PATH中?之前阿铭介绍过:
全栈程序员站长
2022/08/04
1.3K0
图文结合丨带你轻松玩转MySQL Shell for GreatSQL
MySQL Shell 是 MySQL 的一个高级客户端和代码编辑器,是第二代 MySQL 客户端。第一代 MySQL 客户端即我们常用的 MySQL 。除了提供类似于 MySQL 的 SQL 功能外,MySQL Shell 还提供 JavaScript 和 Python 脚本功能,并包括与 MySQL 一起使用的 API 。MySQL Shell 除了可以对数据库里的数据进行操作,还可以对数据库进行管理,特别是对MGR的支持,使用MySQL Shell 可以非常方便的对MGR进行搭建、管理、配置等
GreatSQL社区
2023/09/10
5900
图文结合丨带你轻松玩转MySQL Shell for GreatSQL
GreatSQL一个关于主从复制的限制描述与规避
分享一个在项目运维中遇到的一个主从复制限制的一个坑,项目的架构为主集群+灾备集群,每个集群为一主两从模式。主集群到灾备集群的同步为主从复制的方式,根据业务需求灾备集群需要忽略系统库跟某些配置表,所以才会触发此限制,而这个限制如果我们之前没有遇到过,那么排查起来也是相对不易的。
GreatSQL社区
2023/09/27
2270
GreatSQL一个关于主从复制的限制描述与规避
故障分析 | 使用 mysqldump 备份导致数据丢失
爱可生服务团队成员,负责处理客户在 MySQL 日常运维中遇到的问题;对数据库相关技术有浓厚的兴趣,喜欢钻研各种问题。
爱可生开源社区
2021/12/08
2.1K0
Windows环境下部署MySQL主从并模拟升级到8.0
> * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
GreatSQL社区
2022/02/10
3280
怎样快速地迁移 MySQL 中的数据?
我们通常会遇到这样的一个场景,就是需要将一个数据库的数据迁移到一个性能更加强悍的数据库服务器上。这个时候需要我们做的就是快速迁移数据库的数据。
程序猿川子
2023/01/16
2.4K0
相关推荐
MySQL一主多从复制(基于GTID)
更多 >
交个朋友
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
加入[后端] 腾讯云技术交流站
后端架构设计 高可用系统实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档