vue原生上传实现

PHP大文件上传(切片)分享 前端:vue2,vue3,vue-cli,html5,jquery,webuploader后端:php服务器:linux,centos,Windows,数据库:MySQL,达梦数据库,人大金仓平台:Windows,macOS,Linux,Ubuntu,RedHat,中标麒麟,银河麒麟,统信UOS,信创国产化CPU:x86(Intel,AMD,兆芯,海光),arm(鲲鹏,飞腾),龙芯(mips),龙芯(LoongArch)场景:内网,外网,政府,涉密环境,信创国产化项目。 阅读详情

前沿:

上传是我们开发中必不可少的,我们在使用vue上传时,大部分都会用element UI组件去上传,但是组件也是原生编写而来的,我们在使用的时候,也渐渐忘记了本心,此次就给大家介绍一下在vue中如何实现简单的上传

注:此次就是简单的功能,没有校校验上传格式、大小及时间,拖拽上传。

  1. 我们实现上传首页就是我们的input标签的type=file
  2. 这里我们选择将上传写成一个组件,在组件调用来使用

页面实现

 我们先以上传视频为例

在写上传前我们先了解几个知识点

  • 通过input标签的type属性设置为file,可以创建一个文件上传控件。控件常用的属性

  1. accept:文件类型限制,即让用户只能选择特定类型的文件进行上传。
    eg:accept=".mp4"只能上传mp4格式的。多个文件类型使用逗号隔开,
    eg:accept=".mp4,.mov"。

  2. multiple:设置是否允许同时选择多个文件进行上传。如果设置了multiple属性,用户在使用Ctrl或Shift键的同时点击多个文件,就可以一次性上传多个文件。

  3. capture:设置选择文件时使用设备摄像头或麦克风录音。可选值为"camera"或"microphone"。这个属性目前只有移动端浏览器支持。

  4. disabled:设置文件上传控件是否处于不可用状态。

  5. name:设置文件上传控件的名称。

  6. required:设置文件上传控件是否为必填项,如果用户未选择文件进行上传,则无法提交表单。需要注意的是,该属性不能代替服务器端对文件的非空校验。(这里暂时用不到)

  7. onchange:当文件选择发生变化时,触发此事件处理程序。

  8. value:设置默认文件名

  • 把文件转换成base64地址

window.webkitURL.createObjectURL(file) 方法,将正在上传的文件转换成了可访问的 URL 对象,然后直接在浏览器中播放视频。

  • 格式化文件大小

我们在上传过程中,会需要文件大小渲染的问题,如何正确的计算也是不可缺少的

  // 格式化文件大小
//方法一:
        formatSize ( bytes ) {
            if ( bytes == 0 ) {
                return '0B';
            }
            const k = 1024;
            const sizes = [
                'B',
                'KB',
                'MB',
                'GB',
                'TB',
                'PB',
                'EB',
                'ZB',
                'YB',
            ];
            const i = Math.floor( Math.log( bytes ) / Math.log( k ) );
            return ( bytes / Math.pow( k, i ) ).toFixed( 1 ) + sizes[i];
        },
        
//方法二
        formatSize ( bytes ) {
            if ( bytes < 1024 ) {
                return bytes + 'B';
            }
            if ( bytes < 1024 * 1024 ) {
                return ( bytes / 1024 ).toFixed( 1 ) + 'KB';
            }
            if ( bytes < 1024 * 1024 * 1024 ) {
                return ( bytes / ( 1024 * 1024 ) ).toFixed( 1 ) + 'MB';
            }
            return ( bytes / ( 1024 * 1024 * 1024 ) ).toFixed( 1 ) + 'GB';
        },

了解完上面的,接下来我们进去正式上传实现

一、 上传组件

    <input  accept=".mp4"  type="file">

这里:accept="'.mp4'",我们在点击上传的时候就会看到,格式之外的不可选

下面是我们上传的文件数据格式

 

因为上传样式多样化,我们需要自定义,所以我们将input通过display:none隐藏;
我们在父盒子,调用通过点击事件调用input事件实现上传;

上传过程分为:上传前、上传状态改变(我这里没有写,上传前==上传状态改变)、上传进度、上传失败、上传成功;

<template>
	<div @click="uploadClick">
		<input
			:name="name"
			:accept="accept"
			type="file"
			style="display: none;"
			ref="uploadInput"
			@change="uploadFileChange">
		<!-- 插槽用来插入自定义上传布局 -->
		<slot></slot>
	</div>
</template>

<script>
export default {
    data () {
        return {
            file: null,
            files: [],
        };
    },
    props: {
        // 上传地址
        action: {
            type: String,
            default: '',
        },
        // 上传文件名
        name: {
            type: String,
            default: 'mFile',
        },
        // 是否在选取文件后立即进行上传
        autoUpload: {
            type: Boolean,
            default: true,
        },
        // 文件上传的类型
        accept: {
            type: String,
            default: '',
        },
        // 上传文件前
        beforeUpload: {
            type: Function,
            default: () => Function,
        },
        // 上传文件时的钩子
        onProgress: {
            type: Function,
            default: () => Function,
        },
        onSuccess: {
            type: Function,
            default: () => Function,
        },
        onError: {
            type: Function,
            default: () => Function,
        },
    },
    methods: {
        // 上传文件
        uploadClick () {
            this.$refs.uploadInput.value = '';
            this.$refs.uploadInput.click();
        },
        // 文件改变时
        uploadFileChange ( e ) {
            console.log( '文件改变时');
            this.file =  e.target.files[0];
            this.uploadFile();
        },
        // 上传文件
        uploadFile () {
            let beforeUploadbool = true;
            beforeUploadbool = this.beforeUpload && this.beforeUpload( this.file );
            // beforeUpload返回的值。 beforeUploadbool为false,终止上传
            if ( !beforeUploadbool ) {
                return;
            }
            this.submit();
        },
        submit () {
            const xhr = new XMLHttpRequest();// 1. 创建对象
            const form = new FormData();// 创建一个空表单数据对象
            form.append( this.name, this.file );
            xhr.open( 'POST', this.action, true );// 2. 与服务器建立连接
            xhr.upload.onprogress = ( e ) => { // 监听文件传输进度
                this.onProgress && this.onProgress( e );
            };
            xhr.onload = ( e ) => { // 监听文件传输进度
                console.log( '上传onload');
                if ( e.target.readyState && e.target.status ) {//4 && 200
                    this.onSuccess && this.onSuccess( JSON.parse( e.target.response ), this.file );
                }
            };
            xhr.onerror = ( error ) => {
                this.onError && this.onError( error, this.file );
            };
            xhr.send( form );// 3. 发送请求;
        },
    },

};
</script>

<style>

</style>

2. 使用组件

<template>
	<div>
		<common-upload
			:name="name"
			:action="'http://admop.51vv.com/mpcms/space/test_big_fileUpload'"
			:before-upload="beforeAvatarUpload"
			:on-success="uploadSuccess"
			:on-error="uploadError"
			:on-progress="onProgress"
		>
			<el-button  class="upload-btn" size="small" type="success">
				原生上传
			</el-button>
		</common-upload>
		<div v-show="uploadbool">
			<div><label>文件名:</label>{{file.name ? file.name : ''}}<span class="mb">{{file.size ? formatSize(file.size) : '0b'}}</span></div>
			<div><label>已上传</label><span class="jindu">{{percent}}%</span></div> </div>
		<video
			v-show="uploadbool"
			class="video"
			id="video"
			:src="videoUrl"
			crossorigin="anonymous"
			autoplay="autoplay"
			loop="loop"></video>
	</div>
</template>
<script>
import commonupload from './upload.vue';
export default {
    components: {
        'common-upload': commonupload,
    },
    data () {
        return {
            percent: 0, // 进度
            videoUrl: '',
            file: {},
            uploadbool: false,
        };
    },
    methods: {
        beforeAvatarUpload ( file ) {
            console.log( '上传之前', file );
            //我们可以通过file里的信息上传前判断文件的大小、格式、时长
            this.file = file;
            this.videoUrl = this.getFullPath( file );
            this.uploadbool = true;
            return true;
        },
        onProgress ( e ) {
        //e.loaded 已上传的,e.total总共
            this.percent = parseInt( ( e.loaded / e.total ).toFixed( 2 ) * 100 );
        },
        uploadSuccess ( res, file ) {
            console.log( '上传成功', res, file );
        },
        uploadError ( err, file ) {
            console.log( '上传失败', err, file );
        },
        // 把文件转换成base64地址
        //window.webkitURL.createObjectURL(file) 方法,将正在上传的文件转换成了可访问的 URL 对象,然后直接在浏览器中播放视频。
        getFullPath ( file ) {
            return window.webkitURL.createObjectURL( file );
        },
        formatSize ( bytes ) {
            if ( bytes < 1024 ) {
                return bytes + 'B';
            }
            if ( bytes < 1024 * 1024 ) {
                return ( bytes / 1024 ).toFixed( 1 ) + 'KB';
            }
            if ( bytes < 1024 * 1024 * 1024 ) {
                return ( bytes / ( 1024 * 1024 ) ).toFixed( 1 ) + 'MB';
            }
            return ( bytes / ( 1024 * 1024 * 1024 ) ).toFixed( 1 ) + 'GB';
        },
    },
};
</script>

<style>
label{
    font-weight: bold;
     font-size: 16px;
}
.upload-btn{
    margin-top: 10px;
}
.jindu{
    margin-left: 4px;
    color: #4A90E2;
    font-weight: bold;
    font-size: 16px;
}
.video{
    background: black;
    width: 450px;
    height: 600px;
}
.mb{
    color: #999;
    font-size: 15px;
    margin: 0 20px 0 10px;
}
</style>

觉的有用,希望点个赞支持

Java大文件分片上传/多线程上传实例 大文件切片上传+断点续传解决方案-前后端实现,上传大文件(100G)的解决方案,JAVAWEB项目中的文件上传下载功能的实现,后端用的JAVA,JSP,SpringBoot,前端用了JSP,VUE2,VUE3,React,需要实现大文件的上传和下载。免费提供源码讲解服务,功能讲解,逻辑讲解,原理讲解,思路讲解,核心代码功能实现讲解,新业务功能扩展指导,免费提供编译指导,免费提供部署指导。需要支持包含IE在内的所有浏览器,需要支持信创国产化环境,比如银河麒麟,中标麒麟,龙芯,统信等, 阅读详情

相关推荐

Vue使用el-upload文件(图片)上传

Vue使用element-ui图片上传

专注于技术,分享实战经验,探索技术边界,用代码构建更美的数字世界。 2万+

vue前端实现上传文件的两种方式

第一种方式就是使用FormData的方式进行上传。这里我是根据需求封装了一个组件。 第二种方式使用element-ui的el-upload的方式进行上传

systemdowm的博客 3万+

[图解]SysML与EA实战:住宅安全系统接口块设计全解析

本文详细解析了使用SysML和EA工具进行住宅安全系统接口块设计的全流程。从系统上下文图入门到接口块实战技巧,涵盖块定义图与内部块图的视角转换,以及多图协同建模方法论。特别分享EA工具的高效操作指南和常见问题避坑建议,帮助工程师掌握精确信号定义、端口方向设置等关键技能,提升安防系统设计效率。

weixin_29234509的博客 333

基于Vue实现文件上传

基于Vue实现文件上传:form-data、base64、缩略图、进度条、拖拽上传、切片上传

qq_39064418的博客 1万+

告别误唤醒!S32K3xx低功耗设计避坑指南:Fast Standby模式与WISR寄存器操作详解

本文深入解析了NXP S32K3xx系列MCU在低功耗设计中常见的误唤醒问题,并提供了基于Fast Standby模式的解决方案。文章重点剖析了DCMRWF5寄存器的配置方法、WISR/WISR_64唤醒中断状态寄存器的标志位处理策略,以及如何利用32KB Standby SRAM保存唤醒状态,从而帮助开发者构建稳定可靠的汽车电子低功耗系统。

weixin_29163857的博客 362

tcmalloc(高并发内存池)简化版讲解-项目

高清发不上去,私我发高清,项目完整代码@我。

2201_75352618的博客 910

Vue项目中实现拖拽上传附件:原生JS与Element UI组件方法对比

在Web应用中,拖拽上传附件功能为用户提供了便捷的文件上传体验。本文将介绍在Vue项目中实现拖拽上传附件的两种方法:原生JavaScript和Element UI组件,并对它们进行对比。

Jiaberrr的博客 1712

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1319

vue简单上传图片,压缩图片功能实现(js原生通用)

可以先看 只有上传图片的 js完整demohttps://blog.csdn.net/qq_42221334/article/details/84827369 vue 完整demohttps://blog.csdn.net/qq_42221334/article/details/93198417 参考上传图片 添加了canvas 方法压缩图片,判断图片宽度大于1000时 进行压缩 ...

boy火巨的博客 4821

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1292

Telegram Bot Api使用教程

其中token为你的机器人token,method为telegram给定的方法,在获取群组chat_id那一步就使用了telegram的其中一个方法(getUpdates),其他方法后面会介绍。telegram发送消息的方式类似与钉钉机器人,都是向一个api发送http请求,而且对于同一个APItelegram支持GET和POST两种请求方式.请求的api格式如下。通常来说我们都需要让机器人在一个群组里工作,所以首先我们需要将机器人添加到我们指定的群组,在群组里发送随意消息并@这个机器人,比如...

豫迷糊的码上生活 1万+

vue实现上传图片并预览效果 html+css+js_html、vue中使用原生js实现图片上传,并展示上传之后的结果

×

2401_84182271的博客 647

TC3XX - MCAL知识点(三十九):AURIX™ TC3xx 的EDSADC实现旋变解码功能(应用笔记记录)

本文总结了英飞凌应用笔记中关于EDSADC旋变解码系统的关键内容。系统通过调幅解调获取电机位置和速度信号,支持内外载波生成方案,其中内部载波方案更常用(需2个DSADC通道)。重点介绍了滤波器链配置建议(避免FIR1)、系统条件要求(如偶数积分周期)以及群延迟计算方法。特别分析了SDCAP功能对硬件延迟的补偿机制,指出温度等因素可能导致外部电路延迟变化,需通过计数器测量并通过软件调整积分器起始点来消除角度误差。文中还提供了不同硬件延迟情况下的信号处理示例。

梦想技术家 459

Vue原生实现多文件上传

之前公司的上传都是用的基于Vue的插件,直到最近一次需要多文件上传才发现,事情不是那么简单。 虽然操作你看着是一次选中了多个文件,其实!!!在前端它还是循环一次一个文件上传到后台的!!! 不适用于我新项目的需求:后台一次接受多个文件进行处理。 所以,用了原生去写,没想到就寥寥几行代码搞定!!! 前端 <template lang="pug"> Form(:label-width='80') input(type="file" id="uploadFile"

seven瓜的博客 1576

SAP录入总账凭证报错 公司代码未被分配给国家或用于计算程序的国家消息号 FF703

SAP系统报错FF703的解决方案:当公司代码未分配国家或未配置计税程序时,会导致增值税计算失败。处理方法:1)通过OX02检查公司代码国家字段;2)使用OBBG为国家分配计税程序(如TAXCN)。配置步骤:1)SPRO分配公司代码到国家;2)OBBG设置国家对应的计税程序。注意事项:历史数据需清理才能修改国家字段,不同账簿可配置不同计税程序。完成配置后即可正常处理含税凭证。

金牌架构师 557

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

vue-原生js实现文件上传

1.按钮通过ref触发input的上传功能 <tk-button @click="handleUpLoad">点击上传</tk-button>(自定义标签) <input ref="inputUpLoad" style="display: none" type="file" accept="*" @change="handleFile"/> handle...

JustDI0209的博客 4348

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

vue通过原生input实现多文件上传只调用一次接口

当前组件在批量选择文件后,将文件列表添加到FormData中,只调用一次上传接口;不会像element-ui:开启自动上传+批量文件后多次调用上传接口;也不会批量选择后需要多点击一次批量上传按钮。

Du__Du__的博客 204

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

vue+antd实现手动上传文件,原生实现手动上传文件

【代码】vue+antd实现手动上传文件,原生实现手动上传文件。

Dzb1993的博客 3727

移动端Vue下使用Cropper.js + 原生js实现图片裁剪异步上传功能

Cropper是一个同时支持PC端和移动的图片裁剪工具,这次公司业务需要,所以研究使用了一波,感觉很强大,下面是主流程步骤解析和部分业务源码 一、主要流程 input[type='file']获取图片 实例化new FileReader().readAsDataURL读取input图片,回调结果绑定给img标签显示图片 调用Cropper实例传入两个参数第一个是imgdom,第二个是可...

新欧粒子炮的博客 1102

vue 中通过添加原生 input 实现文件上传

文件上传是通过 input 框 且 type = 'file' 来实现的文件上传功能,在页面标签合适位置添加 <input type="file" name="avatar" accept="image/gif,image/jpeg,image/jpg,image/png" style="display:none" @change="changeImage($event)" ref="avatarInput" /> <!-- 在点

web00_11的博客 5512

vue原生实现element上传多张图片浏览删除

vue原生实现element上传多张图片浏览删除

qq_45479398的博客 536

用vue原生js实现所有格式的文件上传

用vue原生js实现所有格式的文件上传

weixin_44728473的博客 758

vue文件上传组件,使用原生input file实现

vue 实现输入框右侧icon文件夹点击上传图片组件 a. 调用图片上传父组件 formData 就获取 图片上传组件传过来的地址。 // html <upload-image v-model="formData" /> b. 图片上传组件 // html <template> <div> <el-input clearable v-model.trim="uploadImgUrl" size="mini"

qq_40121308的博客 1247

vue上传文件并计算为md5值进行base64编码+原生js实现ajax请求(携带请求头)

vue上传文件并计算为md5值进行base64编码+原生js实现ajax请求(携带请求头) Vue+js+md5+base64上传文件并计算md5值进行base64编码 //1、运行如下命令 npm install --save js-base64 npm install --save js-md5 //2、在项目文件中引入 let Base64 = require('js-base64').Base64 //在需要使用的项目文件中引入: import md5 from 'js-md5'; 页面代码 &l

qq_44178552的博客 928

VUE3 原生JS上传图片(支持多张上传)并实现预览删除功能

有不足的地方请随时指出

qq_63608386的博客 1153
上一篇: JavaScript(if in语句)
下一篇: css样式重置
JSON_JSJ
博客等级 码龄5年 4粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_JSJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值