Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue + Element + vue-quill-editor 实现源码编辑、自定义图片上传和汉化
vue-quill-editor自带的上传,是把图片变成了base64的格式,不符合一般的项目需求。我猜它是用的FileReader的API。
FinGet
2019/06/28
2.4K0
Vue + Element + vue-quill-editor 实现源码编辑、自定义图片上传和汉化
Vue+element图片上传 原
采用比较笨的js解决方法,将bolb文件打开,读取src属性(这是一个base64的数据流),把src的内容一起发送给后端。
晓歌
2018/08/15
1.5K0
Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)
前言   前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子   上传功能命名用formidable实现,示例很简单!   PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介   nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码   这里选择了formidable,也是github上同类功能模块人气比较高的 https://github.com/felixge/node-formidabl
Porschev
2018/01/16
1.5K0
Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)
vue获取上传文件路径_vue中文件上传及接收「建议收藏」
this.imageUrl = URL.createObjectURL(file.raw);
全栈程序员站长
2022/09/22
4.1K0
存储腾讯云(例:上传图片)
服务器属于个人的,需要一定的权限才能自由上传图片,这个负责权限验证的其实就是秘钥。拥有秘钥是进行上传的基础条件。
玖柒的小窝
2021/10/26
17.9K0
存储腾讯云(例:上传图片)
el-upload上传文件
这个比较简单,因为element-plus也封装好了,只需要使用headers属性,去设置请求头即可
赤蓝紫
2023/03/16
2.2K0
el-upload上传文件
移动端图片上传旋转、压缩的解决方案
前言 在手机上通过网页 input 标签拍照上传图片,有一些手机会出现图片旋转了90度的问题,包括 iPhone 和个别三星手机。这些手机竖着拍的时候才会出现这种问题,横拍出来的照片就正常显示。因此,
IMWeb前端团队
2017/12/29
5K0
移动端图片上传旋转、压缩的解决方案
黑马瑞吉外卖之文件上传和下载
文件上传的前端页面我们使用到的是spring-web对上传代码的一个封装。 我们采用到一个上传的前端页面
兰舟千帆
2022/09/26
4240
tinymce图片上传
对于上传图片功能,tinymce提供了很多相关配置http://tinymce.ax-z.cn/configure/file-image-upload.php
py3study
2021/04/16
6.8K0
tinymce图片上传
SpringBoot 2.0 多图片上传加回显
这两天公司有需求让做一个商户注册的后台功能,其中需要商户上传多张图片并回显。由于之前没做过这方面的东西,此篇文章用以记录一些知识点,以便后续查看。
科技新语
2025/02/07
2310
SpringBoot 2.0 多图片上传加回显
antdesign + koa 实现图片上传
我们今天实现一下图片上传,前端用到的是antdesign中的文件上传,后端是自己封装的node的koa框架。
用户4793865
2023/01/12
9430
文件上传杂谈
文件上传是前端很常见的一类场景。图片、视频和文档等等都属于文件范畴,每个文件则是通过 File.Type 进行更细的划分。本文将针对文件上传的一些通用维度场景做简单的剖析和尝试,抛砖引玉,希望共同学习,共同成长。
有赞coder
2021/01/18
1.6K0
文件上传杂谈
nodejs记录2——一行代码实现文件下载
主要使用fs模块的pipe方法,简单粗暴: import fs from "fs"; import path from 'path'; import request from 'request';
用户1141560
2017/12/26
1.4K0
如何使用云开发进行图片上传
云开发,相信大家都不陌生,在我们的日常开发中,总少不了需要把图片进行上传的应用场景。
Doggy
2020/07/03
3.3K0
如何使用云开发进行图片上传
Fabric.js 将本地图像上传到画布背景
这次要实现的效果是:在本地上传一张图片,然后渲染到 canvas 里(当做背景图)。
德育处主任
2022/04/17
3.2K0
Fabric.js 将本地图像上传到画布背景
基于业务场景下的图片/文件上传方案总结
图片/文件上传组是企业项目开发中必不可少的环节之一, 但凡涉及到用户模块的都会有图片/文件上传需求, 在很多第三方组件库(ant desigin, element ui)中它也是基础组件之一. 接下来笔者就来带大家从零实现一款图片/文件上传组件以及扩展出更强大的上传组件.
徐小夕
2020/10/10
1.8K0
基于业务场景下的图片/文件上传方案总结
vue.js + axios.js图片压缩处理并上传到服务器demo
点击查看效果 图片压缩原理 将图片重新画入一个canvas中。可设置最大宽度,再按图片宽高比例定义canvas画布的宽高。 完整代码demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传图片</title> <meta name="renderer" content="webkit"> <meta name="viewport" content="widt
别盯着我的名字看
2022/06/09
5.8K0
vue-element-admin上传图片
在vue后台管理系统里面,有时候会遇到一个图片上传的功能,做这个功能的时候的思路是这样的: 1:首选由前端写一个图片上传的upload标签,选择本地的图片文件之后 2:调用后端给的接口,以二进制文件的形式传给后端服务器 3:服务器进行处理,处理完成之后将服务器的主机名加到图片名称的前缀上 4:返回一个有服务器主机+图片名称的在线就可以访问的链接给到前端 5:前端直接将在线链接路径渲染在界面显示图片
王小婷
2020/11/26
1.2K0
你要的Spring Boot多图片上传回显功能已经实现了,赶紧收藏吃灰~
这两天公司有需求让做一个商户注册的后台功能,其中需要商户上传多张图片并回显。由于之前没做过这方面的东西,此篇文章用以记录一些知识点,以便后续查看。
程序猿DD
2021/07/13
1.4K0
你要的Spring Boot多图片上传回显功能已经实现了,赶紧收藏吃灰~
element ui 图片上传封装多张或单张
最近写了一个后台管理项目,发现每个后台项目都离不开上传图片,决定把上传图片做个封装,话不多说直接上代码!
前端小白@阿强
2020/08/11
2.5K0
相关推荐
Vue + Element + vue-quill-editor 实现源码编辑、自定义图片上传和汉化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验