位置: IT常识 - 正文

el-upload上传文件(el-upload上传文件必传校验)

编辑:rootadmin
el-upload上传文件 el-upload上传文件前言

推荐整理分享el-upload上传文件(el-upload上传文件必传校验),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:el-upload上传文件和参数,el-upload上传文件参数,el-upload上传文件到本地,el-upload上传文件携带参数,el-upload上传文件夹,el-upload上传文件进度条,el-upload上传文件夹,el-upload上传文件必传校验,内容如对您有帮助,希望把文章链接给更多的朋友!

公司和学校项目都用到了上传文件的功能,记录一下。

准备express实现的上传接口const express = require('express');​// 文件上传模块const multiparty = require('multiparty')​// 提供跨域资源请求const cors = require('cors')​// 文件操作const fs = require('fs')​const app = express();​app.use(cors());​app.get('/policy', (req, res) => { res.json({ code: 200, msg: '成功', url: '/upload', filename: 'clz' })});​app.post('/upload', (req, res) => { let form = new multiparty.Form()​ // 配置文件存储路径 form.uploadDir = './upload'​ form.parse(req, (err, fields, files) => { // 解析formData​ for (const file of files.file) { const newPath = form.uploadDir + '/' + file.originalFilename​ // renameSync(oldPath, newPath):同步重命名文件,oldPath使用默认上传路径,newPath则是想要保存到的路径 fs.renameSync(file.path, newPath); }​ res.json({ code: 200, msg: '上传成功' }) })});​app.listen(8088, () => { console.log('http://localhost:8088/');});

如果需要使用,自行查阅express用法,也可以到本人博客中查看简单教程。

开始简单使用版本<template> <el-upload action="http://localhost:8088/upload" :show-file-list="true" :on-success="handleSuccess" :on-error="handleError" > <el-button type="primary">上传图片</el-button> </el-upload></template>​<script setup>import { ElMessage } from "element-plus";​const handleSuccess = (res, file, files) => { console.log(res); console.log(file, files);​ new ElMessage({ type: "success", message: "上传成功", });};​const handleError = (error, file, files) => { console.log(error); console.log(file, files); ElMessage.error("上传失败");};</script>​<style lang="less" scoped></style>​

解释下上面的属性:

action:请求URL

show-file-list:是否展文件列表(如果没上传成功,则会闪现一下,再消失)

on-success:文件上传成功钩子

参数:res:后端返回的成功响应数据(响应状态为成功时)file:上传的文件files:成功上传的文件列表

on-success:文件上传失败钩子

参数:error:错误对象,内容是后端返回的响应数据(响应状态为失败时,如状态码为500)file:上传的文件files:成功上传的文件列表

接下来,去后端设置的路径去看看有没有成功保存上传的文件。

添加token

这个比较简单,因为element-plus也封装好了,只需要使用headers属性,去设置请求头即可

<el-upload action="http://localhost:8088/upload" :headers="{ token: '12345' }"> <el-button type="primary">上传图片</el-button></el-upload>

上传前获取签名再上传

有时候并不是直接上传就可以的,比如一开始并没有上传路径,需要调用获取签名接口来获取上传路径。这个时候就可以使用我们的上传文件之前的钩子before-upload。在上传前调用获取签名的接口,用拿到的url去修改,上传路径,就能够上传了。

<template> <el-upload :action="url" :before-upload="getPolicy"> <el-button type="primary">上传图片</el-button> </el-upload></template>​<script setup>import axios from "axios";import { reactive, ref } from "vue";​const url = ref("");​const getPolicy = () => { return new Promise((resolve, reject) => { axios .get("http://localhost:8088/policy") .then((res) => { const { data } = res;​ if (data.code === 200) { url.value = `http://localhost:8088${data.url}`;​ resolve(); } }) .catch((error) => { reject(error); }); });};</script>​<style lang="less" scoped></style>

手动上传

我们上面的例子都是选中文件后,就会上传,但是有时候我们会有点击按钮才去上传的需求,这个时候就需要结合auto-upload和submit来实现手动上传了。先设置auto-upload为false,取消自动上传,这个时候选中图片后就没有上传了,所以我们在按钮的点击事件中,还得使用DOM去调用submit方法去手动上传。

<template> <el-upload ref="upload" action="http://localhost:8088/upload" :auto-upload="false" > <el-button type="primary">上传图片</el-button> </el-upload>​ <el-button type="primary" @click="confirm">确定</el-button></template>​<script setup>import { getCurrentInstance } from "vue";​const { proxy } = getCurrentInstance();​const confirm = () => { proxy.$refs.upload.submit();};</script>​<style lang="less" scoped></style>

上传的时候修改文件名

情境:调用签名接口时也给你返回一个文件名,前端在上传的时候需要把文件名改掉再上传,让服务器保存的是规范的文件名。

el-upload上传文件(el-upload上传文件必传校验)

首先,先说一下结论:无法通过修改File对象的name属性,实现重命名

在上传前钩子中修改File对象的name属性<template> <el-upload action="http://localhost:8088/upload" :before-upload="getPolicy" > <el-button type="primary">上传图片</el-button> </el-upload></template>​<script setup>// 上传前钩子const getPolicy = (file) => { console.log(file);​ file.name = "clz.png"; // 如果在上传前钩子中对文件的name属性进行修改,则会导致上传不了。而且不报错,难以发现问题所在。​ console.log(file.name);};</script>​<style lang="less" scoped></style>

毫无波澜。

上传文件时修改

通过http-request属性,覆盖默认的上传行为。

<template> <el-upload action="";};</script>​<style lang="less" scoped></style>

直接报错

解决方案

既然不能直接修改File对象的name属性来实现重命名操作,那么应该怎么办呢?

这个时候就需要通过new File构造函数去再创建一个文件,创建的同时更改名字。

<template> <el-upload action="");​ console.log(cloneFile);};</script>​<style lang="less" scoped></style>

注意:如果是更改一个文件的文件名的话,File的构造函数第一个参数应该是包住file的数组

但是这个时候,又有问题了,我们已经使用http-request覆盖默认的上传的行为了,所以我们还得重新实现上传。

上传文件首先需要formData对象,然后给formData添加上数据,在把formData通过接口发出去即可。

<template> <el-upload action="#" :http-request="httpRequest"> <el-button type="primary">上传图片</el-button> </el-upload></template>​<script setup>import axios from "axios";import { ElMessage } from "element-plus";​const httpRequest = ({ file }) => { console.log(file);​ const cloneFile = new File([file], "clz.png");​ const formData = new FormData(); formData.append("file", cloneFile);​ axios.post("http://localhost:8088/upload", formData).then((res) => { if (res === 200) { new ElMessage({ type: "success", message: "上传成功", }); } });};</script>​<style lang="less" scoped></style>

小贴士

上面已经说出解决方法了,但是,重命名一般不会帮你把文件后缀都给改掉。所以这个时候可以通过正则表达式把后缀给取出来。

const houzhui = file.name.replace(/.+./, "");const newFile = new File([file], filename+houzhui);一次请求上传多个文件

el-upload默认一个请求上传一个文件。需要上传多个文件首先得添加multiple属性。

上面的例子中,我们可以发现,我们上面选中了两个文件,点击确定,上传图片时调用了两次上传接口。

既然el-upload默认一个请求上传一个文件,那么我们就不要使用el-upload的上传方法就行了。点击确定按钮时,去调用一个上传文件方法。

因为我们点击确定时,需要获取选中的文件,所以需要有file-list属性,保存选中的文件。

<template> <el-upload ref="upload" action="#" multiple :file-list="fileList" :auto-upload="false" > <el-button type="primary">上传图片</el-button> </el-upload>​ <el-button type="primary" @click="confirm">确定</el-button></template>

点击确定按钮,会触发confirm事件,实现一个请求上传多个文件的关键就在这,这个时候创建一个formData对象,遍历选中的文件列表,通过append添加到formData上。最后在调用uploadFile函数,真正把文件上传上去。

const fileList = reactive([]);​const confirm = () => { const formData = new FormData();​ console.log(fileList);​ for (const file of fileList) { formData.append("file", file.raw); }​ uploadFiles(formData);};​function uploadFiles(data) { axios.post("http://localhost:8088/upload", data).then((res) => { if (res === 200) { new ElMessage({ type: "success", message: "上传成功", }); } });}

小技能获取图片的宽高像素// 创建Image对象const img = new Image();​// 设置图片的srcimg.src = 'https://www.clzczh.top/medias/featureimages/19.png';​// 添加load事件,图片加载完成后执行img.onload = () => { // 获取图片的宽高像素 console.log(img.width, img.height);};
本文链接地址:https://www.jiuchutong.com/zhishi/300199.html 转载请保留说明!

上一篇:翻译: 详细图解Transformer多头自注意力机制 Attention Is All You Need(图幅翻译)

下一篇:【ChatGPT】ChatGPT-5 强到什么地步?(chat p)

  • 华为手机语音转文字功能在哪里(华为手机语音转换)

    华为手机语音转文字功能在哪里(华为手机语音转换)

  • 相机360怎么去除水印(360相机怎么关闭拍照声音)

    相机360怎么去除水印(360相机怎么关闭拍照声音)

  • opporeno4pro电池是多大(opporeno4pro手机电池)

    opporeno4pro电池是多大(opporeno4pro手机电池)

  • excel数据分析在哪里(如何学做数据分析)

    excel数据分析在哪里(如何学做数据分析)

  • 网桥三个基本功能(简述网桥的功能和分类)

    网桥三个基本功能(简述网桥的功能和分类)

  • 1920x1080是多少像素(1920x1080是多少像素/英寸)

    1920x1080是多少像素(1920x1080是多少像素/英寸)

  • 华为p40卡2在哪(华为p40卡1和卡2区别)

    华为p40卡2在哪(华为p40卡1和卡2区别)

  • 3600配什么主板(2600配什么主板)

    3600配什么主板(2600配什么主板)

  • oppoa9后壳是玻璃的吗(oppoa9手机后盖是不是玻璃的)

    oppoa9后壳是玻璃的吗(oppoa9手机后盖是不是玻璃的)

  • 独显加核显是什么意思(独显加核显好还是独显好)

    独显加核显是什么意思(独显加核显好还是独显好)

  • iphone右滑返回能改左滑么(iphone右滑返回不好用)

    iphone右滑返回能改左滑么(iphone右滑返回不好用)

  • 苹果11微信有办法美颜吗(苹果11有微信锁吗)

    苹果11微信有办法美颜吗(苹果11有微信锁吗)

  • ipad插卡版能连wifi吗(ipad插卡版可以连接无线网吗)

    ipad插卡版能连wifi吗(ipad插卡版可以连接无线网吗)

  • gps沒打开能定位吗(手机gps不打开是否会显示位置)

    gps沒打开能定位吗(手机gps不打开是否会显示位置)

  • 苹果11可以反向充电吗(苹果11可以反向充电嘛)

    苹果11可以反向充电吗(苹果11可以反向充电嘛)

  • 微信退群群主知道吗(微信不显示群聊)

    微信退群群主知道吗(微信不显示群聊)

  • 手机黑屏是怎么回事(手机黑屏是怎么回事,教您如何恢复手机使用华为)

    手机黑屏是怎么回事(手机黑屏是怎么回事,教您如何恢复手机使用华为)

  • 苹果高通基带怎么查(苹果高通基带怎么安装)

    苹果高通基带怎么查(苹果高通基带怎么安装)

  • 手机apn怎么设置网速快(手机APN怎么设置好)

    手机apn怎么设置网速快(手机APN怎么设置好)

  • 拼多多帮人砍价为什么都是0元(拼多多帮人砍价免费拿是真的吗)

    拼多多帮人砍价为什么都是0元(拼多多帮人砍价免费拿是真的吗)

  • 一键换机微信聊天记录还有吗(一键换机微信聊天记录可以换到新手机么)

    一键换机微信聊天记录还有吗(一键换机微信聊天记录可以换到新手机么)

  • pencil怎么激活(pencil2怎么激活)

    pencil怎么激活(pencil2怎么激活)

  • 小米旗下机器人叫什么(小米智能机器人是谁)

    小米旗下机器人叫什么(小米智能机器人是谁)

  • vivox27视频美颜在哪(vivox27视频美颜怎么没有了)

    vivox27视频美颜在哪(vivox27视频美颜怎么没有了)

  • 鸿蒙3.0平板适配名单最新详情(鸿蒙3.0平板适配名单)

    鸿蒙3.0平板适配名单最新详情(鸿蒙3.0平板适配名单)

  • 如何在局域网内共享文件(如何在局域网内发布网页)

    如何在局域网内共享文件(如何在局域网内发布网页)

  • macOS Big Sur 11.2 RC 2正式发布(附更新内容)

    macOS Big Sur 11.2 RC 2正式发布(附更新内容)

  • (学习笔记一)基于YOLOv5的车辆检测项目(基训包括哪些)

    (学习笔记一)基于YOLOv5的车辆检测项目(基训包括哪些)

  • 转让金融商品需要缴纳增值税吗
  • 所得税汇算资产总额怎么算
  • 劳务公司一般纳税人要交什么税
  • 所得税退税的会计处理方法
  • 进项发票已认证,发现发票有问题怎么办
  • 诚信纳税的含义是什么
  • 初中毕业可以考警察学校吗
  • 银行开户手续费怎么开发票
  • 产品成本包括哪几个部分
  • 车间加班视频
  • 子公司对母公司的责任
  • 土地使用税什么意思
  • 餐饮行业享受免增值税政策怎么开发票
  • 月初发票认证能抵扣吗
  • 购进的固定资产多少金额可以直接进去费用
  • 行业协会需要办理税务登记证吗
  • 免税农产品转出进项税税率
  • 申请增值税一般纳税人登记在办理手续
  • 非专利技术属于无形资产吗?
  • 企业破产应收账款要发询证函吗
  • 银行汇票超期退回怎么办
  • 销售退回涉及的科目
  • 生产领用产成品验证会计分录
  • Linux系统中Squid代理服务器配置全过程解析
  • 笔记本如何打开无线网络开关
  • 什么手机最薄最有手感
  • 工程建设质保金规定
  • 不合规发票入账违反了什么纪律
  • 生育津贴差额账务处理
  • 天国拯救晕倒的人多久起来
  • vscode简单入门
  • 万字短文
  • 灵活就业养老保险退休后每月领多少钱
  • php正则替换字符串
  • 从 零开始
  • 包装物应交消费税
  • 用谷歌浏览
  • 日用品属于哪个类型
  • 企业所得税季报营业成本包括哪些
  • 个人所得税大病医疗夫妻双方怎么扣除
  • 企业所得税预缴可以不交吗
  • PostgreSQL教程(一):数据表详解
  • sql server数字类型
  • 中介公司服务范围都有哪些
  • 票据粘贴顺序是什么
  • 哪些情况可以免征个人所得税
  • 开外经证时需要马上交税吗
  • 征税小规模纳税申报
  • MySQL数据库介绍
  • 产品的运输费用分录
  • 缴纳残保金工资是实发工资还是应发工资
  • 研发设备的折旧计入研发费用吗
  • 帐户结余
  • 捆绑销售如何做会计处理合适?
  • 出口退税进项税额转出怎么申报
  • 结转完工入库产品成本的会计分录
  • 外购材料用于建筑工程会计分录
  • 应收账款占比高受哪些因素影响
  • 收履约保证金的会计分录
  • 合同资产相当于以前什么会计科目
  • 会计人员基本信息表去哪找
  • 进口料件内销的关税和增值税怎么计算
  • 购买税控系统分录
  • sqlserver 触发器 redis
  • Windows Server 2008中审核和符合性
  • centos安装插件
  • xp系统怎么更改用户权限
  • xp无法识别的usb设备unknown device
  • centos7.5切换图形界面
  • win7同步中心怎么关掉
  • win10鼠标箭头怎么换样式
  • win1020h2无法重启
  • linux 管道实现
  • windows7文件丢失
  • win8的开始和运行在哪儿
  • js 箭头表达式
  • python不能用
  • unity编译速度吃什么硬件?
  • android开发之apritag
  • 支付给境外的特许权使用费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设