前端使用vue-simple-uploader进行分片上传

目录

 一、安装vue-simple-uploader

二、在vue中使用 


 一、安装vue-simple-uploader

npm install vue-simple-uploader --save

main.js初始化vue-simple-uploader

import uploader from 'vue-simple-uploader'Vue.use(uploader)

common/config文件

export const ACCEPT_CONFIG = {image: ['.png', '.jpg', '.jpeg', '.gif', '.bmp'],video: ['.mp4', '.rmvb', '.mkv', '.wmv', '.flv'],document: ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.pdf', '.txt', '.tif', '.tiff', '.rar', '.zip'],getAll() {return [...this.image, ...this.video, ...this.document]}
}

二、在vue中使用 

<template><!-- 上传器 --><!-- 1、 options:uploader属性配置
fileStatusText:上传结果信息提示
@upload-start="onUploadStart" // 上传开始监听
@file-added="onFileAdded" // 文件上传到服务器前操作,可用校验等
@file-progress="onFileProgress" // onFileProgress上传进度回调
@file-success="onFileSuccess" // 所有分片上传完毕执行
@file-error="onFileError" // 上传错误监听 --><uploaderref="uploader":options="options":auto-start="false":file-status-text="fileStatusText"class="uploader-ui"@file-added="onFileAdded"@file-success="onFileSuccess"@file-progress="onFileProgress"@file-error="onFileError"><uploader-unsupport /><uploader-drop><div><uploader-btn id="global-uploader-btn" ref="uploadBtn" :attrs="attrs">选择文件<i class="el-icon-upload el-icon--right" /></uploader-btn></div></uploader-drop><uploader-list /></uploader>
</template><script>
import { ACCEPT_CONFIG } from '@/common/config'
import SparkMD5 from 'spark-md5'
import * as API from '@/api/index'
// import { mergeFile } from '@/api/modules/uploadFile'export default {data() {return {options: {// 目标上传 URL,默认POST   文件块上传  分片检查接口target: '/upgrade/system/fileTransfer/chunk',// 分块大小(单位:字节)chunkSize: '2048000',// 上传文件时文件内容的参数名,对应chunk里的Multipart对象名,默认对象名为filefileParameterName: 'upfile',// 失败后最多自动重试上传次数maxChunkRetries: 3,// 是否开启服务器分片校验,对应GET类型同名的target URLtestChunks: true,/*服务器分片校验函数,判断秒传及断点续传,传入的参数是Uploader.Chunk实例以及请求响应信息reponse码是successStatuses码时,才会进入该方法reponse码如果返回的是permanentErrors 中的状态码,不会进入该方法,直接进入onFileError函数 ,并显示上传失败reponse码是其他状态码,不会进入该方法,正常走标准上传checkChunkUploadedByResponse函数直接return true的话,不再调用上传接口*/checkChunkUploadedByResponse: function(chunk, response_msg) {const objMessage = JSON.parse(response_msg)if (objMessage.data.skipUpload) {return true}return (objMessage.uploadedChunks || []).indexOf(chunk.offset + 1) >= 0}},// 接受的文件类型attrs: {accept: ACCEPT_CONFIG.getAll()},fileStatusText: {success: '上传成功',error: '上传失败',uploading: '上传中',paused: '暂停',waiting: '等待上传'},relativePath: ''}},methods: {// 文件上传到服务器前操作,可用校验等onFileAdded(file) {this.relativePath = file.relativePaththis.computeMD5(file)},// onFileProgress上传进度回调onFileProgress(rootFile, file, chunk) {console.log(`上传中 ${file.name},chunk:${chunk.startByte / 1024 / 1024} ~ ${chunk.endByte / 1024 / 1024}`)},/*第一个参数 rootFile 就是成功上传的文件所属的根 Uploader.File 对象,它应该包含或者等于成功上传文件;第二个参数 file 就是当前成功的 Uploader.File 对象本身;第三个参数就是 message 就是服务端响应内容,永远都是字符串;第四个参数 chunk 就是 Uploader.Chunk 实例,它就是该文件的最后一个块实例,如果你想得到请求响应码的话,chunk.xhr.status就是*/// 成功之后调取合并接口onFileSuccess(rootFile, file, response, chunk) {const data = {fileMd5: file.uniqueIdentifier,fileSize: file.size,fileSource: 0,fileName: file.relativePath}API.mergeFile(data).then(res => {console.log(this.$refs.uploader)this.$emit('handlerCloses', file, this.$refs.uploader)})// refProjectId为预留字段,可关联附件所属目标,例如所属档案,所属工程等// file.refProjectId = '123456789'// mergeFile(file).then(responseData => {//   if (responseData.data.code === 415) {//     console.log('合并操作未成功,结果码:' + responseData.data.code)//   }// }).catch(function(error) {//   console.log('合并后捕获的未知异常:' + error)// })},// 上传错误监听onFileError(rootFile, file, response, chunk) {console.log('上传完成后异常信息:' + response)},//  计算md5,实现断点续传及秒传   @param filecomputeMD5(file) {file.pause()// 单个文件的大小限制2Gconst fileSizeLimit = 2 * 1024 * 1024 * 1024console.log('文件大小:' + file.size)console.log('限制大小:' + fileSizeLimit)if (file.size > fileSizeLimit) {this.$message({showClose: true,message: '文件大小不能超过2G'})file.cancel()}const fileReader = new FileReader()const time = new Date().getTime()const blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlicelet currentChunk = 0const chunkSize = 10 * 1024 * 1000const chunks = Math.ceil(file.size / chunkSize)const spark = new SparkMD5.ArrayBuffer()// 由于计算整个文件的Md5太慢,因此采用只计算第1块文件的md5的方式const chunkNumberMD5 = 1loadNext()fileReader.onload = e => {spark.append(e.target.result)if (currentChunk < chunkNumberMD5) {loadNext()} else {const md5 = spark.end()file.uniqueIdentifier = md5file.resume()// const api = true// const params = {//   fileMd5: md5,//   fileName: this.relativePath// }// // 分片检查  是否有重复的md5// API.transChunk(params).then(res => {//   console.log(res.data.skipUpload)//   // 无重复文件//   if (res.data.skipUpload === false) {//     file.uniqueIdentifier = md5//     file.resume()//   } else if (res.data.skipUpload === true) {//     console.log(res.data.skipUpload, 'true')//     this.$message.error('已上传过此文件!')//     // 有重复的文件上传 则退出//     file.cancel()//   }// })console.log(`MD5计算完毕:${file.name} \nMD5:${md5} \n分片:${chunks} 大小:${file.size} 用时:${new Date().getTime() - time} ms`)}}fileReader.onerror = function() {this.error(`文件${file.name}读取出错,请检查该文件`)file.cancel()}function loadNext() {const start = currentChunk * chunkSizeconst end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSizefileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end))currentChunk++console.log('计算第' + currentChunk + '块')}},close() {this.uploader.cancel()},error(msg) {this.$notify({title: '错误',message: msg,type: 'error',duration: 2000})}}
}
</script><style>.uploader-ui {padding: 15px;margin: 40px auto 0;font-size: 12px;font-family: Microsoft YaHei;box-shadow: 0 0 10px rgba(0, 0, 0, .4);}.uploader-ui .uploader-btn {margin-right: 4px;font-size: 12px;border-radius: 3px;color: #FFF;background-color: #409EFF;border-color: #409EFF;display: inline-block;line-height: 1;white-space: nowrap;}.uploader-ui .uploader-list {max-height: 440px;overflow: auto;overflow-x: hidden;overflow-y: auto;}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号传输中串扰的影响.

1.导线间的串扰 当导线之间发生串扰时,一根导线上的信号会影响到另一根信号线,给连接的电路造成干扰。这种现象通常发生在平行的导线之间。在设计设备的布线时,特别要注意低电平模拟信号的传输问题。附近导线对其的串扰常常是系统性能下降的主要原因。因此在布线设计时,必须…

docker容器代理上网问题解决参考

背景&#xff1a;折腾一个项目&#xff0c;奈何很多依赖来自外部服务器。 一、网上冲浪做法 1、修改docker配置文件 2、根据docker官方教程设置代理配置 3、设置端口映射 4、加载镜像时&#xff0c;设置网络只能走本地 奈何都没有解决容器内部代理上网问题 二、个人做法…

seq2seq编码器-解码器实现

我们在之前的文章快速上手LSTM-CSDN博客中提及了RNN的几种不同的类型&#xff0c;其中有同步的 many to many 的根据视频的每一帧对视频分类任务&#xff0c;以及异步的 many to many 文本翻译。对于这种输入和输出不等长的序列&#xff0c;我们采用seq2seq&#xff08;sequenc…

一步步成为React全栈大师:从环境搭建到应用部署

文章目录 第一步&#xff1a;环境搭建第二步&#xff1a;了解React基础第三步&#xff1a;组件与路由第四步&#xff1a;状态管理第五步&#xff1a;接口与数据交互第六步&#xff1a;样式与布局第七步&#xff1a;测试第八步&#xff1a;构建与部署《深入浅出React开发指南》内…

【面试官问】Redis 持久化

目录 【面试官问】Redis 持久化 Redis 持久化的方式RDB(Redis DataBase)AOF(Append Only File)混合持久化:RDB + AOF 混合方式的持久化持久化最佳方式控制持久化开关主从部署使用混合持久化使用配置更高的机器参考文章所属专区

React 面试题

1、组件通信的方式 父组件传子组件&#xff1a;通过props 的方式 子组件传父组件&#xff1a;父组件将自身函数传入&#xff0c;子组件调用该函数&#xff0c;父组件在函数中拿到子组件传递的数据 兄弟组件通信&#xff1a;找到共同的父节点&#xff0c;用父节点转发进行通信 …

一键转换MOV至MP3:轻松删除原视频,释放存储空间!

你是否曾经有一个MOV格式的视频文件&#xff0c;想要提取其中的音频却苦于没有合适的工具&#xff1f;现在&#xff0c;有了我们的全新视频剪辑工具&#xff0c;这个烦恼全部消失&#xff01;我们为你提供一键式解决方案&#xff0c;将MOV视频文件快速转换为MP3音频格式。 首先…

基于单片机的造纸纸浆液位控制系统结构设计

摘要:为适应无人化与高效化制浆造纸生产体系&#xff0c;造纸企业趋于以嵌入式技术优化造纸过 程中的纸浆液位控制系统&#xff0c;以单片机与传感器相互耦合实现纸浆液位控制。本文基于单片机 设计了造纸纸浆液位控制系统&#xff0c;其结构由控制模块、信息采集模块、物联网模…

备战蓝桥杯---搜索(应用入门)

话不多说&#xff0c;直接看题&#xff1a; 显然&#xff0c;我们可以用BFS&#xff0c;其中&#xff0c;对于判重操作&#xff0c;我们可以把这矩阵化成字符串的形式再用map去存&#xff0c;用a数组去重现字符串&#xff08;相当于map映射的反向操作&#xff09;。移动空格先找…

JVM之Java内存区域

JVM-Java内存区域 Java内存区域是Java虚拟机&#xff08;JVM&#xff09;管理的内存资源的逻辑划分&#xff0c;用于存储程序运行时所需的数据。Java内存区域的合理划分和管理对于程序的性能和稳定性具有重要影响。本文将深入探讨Java内存区域的各个部分&#xff0c;包括方法区…

(delphi11最新学习资料) Object Pascal 学习笔记---第4章第2节( 参数和返回值)

4.2 参数和返回值 ​ 调用函数或过程时&#xff0c;需要传递正确数量的参数&#xff0c;并确保它们符合预期类型。否则&#xff0c;编译器会发出错误信息&#xff0c;就像给变量赋值时类型不匹配一样。前面的 DoubleIt 函数定义了一个 整数参数&#xff0c;如果调用&#xff1…

vit细粒度图像分类(九)RAMS-Trans学习笔记

1.摘要 在细粒度图像识别(FGIR)中&#xff0c;区域注意力的定位和放大是一个重要因素&#xff0c;基于卷积神经网络(cnn)的方法对此进行了大量探索。近年来发展起来的视觉变压器(ViT)在计算机视觉任务中取得了可喜的成果。与cnn相比&#xff0c;图像序列化是一种全新的方式。然…

npm ERR! code CERT_HAS_EXPIRED

执行npm i报错&#xff1a; npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/react-redux failed, reason: connect ETIMEDOUT 104.16.2.35:443 npm ERR! network This is a problem rel…

机器学习算法之支持向量机(SVM)

支持向量机(Support Vector Machine,简称SVM)是一种广泛用于分类、回归和其他学习任务的强大的监督学习算法。SVM的目标是找到一个超平面,以最大化地分隔不同类别的数据点。在二维空间中,这个超平面可以被看作是一条直线,但在更高维度的空间中,它可能是一个平面或者更复…

Android PMS——网络下载应用安装(六)

我们接着上一篇文章继续分析,文章最后调用到了 PackageManagerService 中的 installStage() 方法,这里就是正式开始 APK 的安装过程。 一、安装流程 1、PackageManagerService 源码位置:/frameworks/base/services/core/java/com/android/server/pm/PackageManagerServic…

使用ESP32-S3对MQ-135空气质量传感器的使用记录(Arduino版)

一、硬件上&#xff1a; 1、使用esp32开发板的04引脚与AO连接&#xff0c;检测AO引脚的电平 二、软件上&#xff1a; 1、使用Arduino快速完成开发 2、源码&#xff1a; // Potentiometer is connected to GPIO 04 (Analog ADC1_CH3) const int adcPin 4;// variable for s…

十大排序算法之堆排序

堆排序 在简单选择排序文章中&#xff0c;简单选择排序这个“铁憨憨”只顾着自己做比较&#xff0c;并没有将对比较结果进行保存&#xff0c;因此只能一遍遍地重复相同的比较操作&#xff0c;降低了效率。针对这样的操作&#xff0c;Robertw.Floyd 在1964年提出了简单选择排序…

C#(C Sharp)学习笔记_数据类型与变量赋值【三】

前言 本期内容会介绍到C#的数据类型&#xff0c;变量和赋值基本操作。当然了&#xff0c;我会简略的讲解常用的数据类型的应用及变量和赋值。 1.数据类型 C#中的数据类型与其他编程语言如出一辙&#xff0c;一下为数据类型参考表。 类型描述范围默认值bool布尔值True 或 Fa…

再谈Redis三种集群模式:主从模式、哨兵模式和Cluster模式

总结经验 redis主从:可实现高并发(读),典型部署方案:一主二从 redis哨兵:可实现高可用,典型部署方案:一主二从三哨兵 redis集群:可同时支持高可用(读与写)、高并发,典型部署方案:三主三从 一、概述 Redis 支持三种集群模式,分别为主从模式、哨兵模式和Cluster模式。…

【学习笔记】Python 环境隔离

文章目录 前言venvvenv 环境管理venv 包管理 virtualenv 以及 virtualenvwrapper安装virtualenvwrapper 环境管理virtualenvwrapper 包管理 condaconda 环境管理conda 包管理 总结参考资料 Python 作为最常用的脚本语言&#xff0c;有着非常丰富的第三方库&#xff0c;但是这也…