600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > vue获取上传进度_vue webuploader实现文件分片上传 并显示上传进度

vue获取上传进度_vue webuploader实现文件分片上传 并显示上传进度

时间:2021-07-23 05:07:06

相关推荐

vue获取上传进度_vue webuploader实现文件分片上传 并显示上传进度

1.效果图

2.上传文件时,如果使用普通上传,则需要上传一个文件完成后才能上传下一个文件,如果文件很大时,可能会造成浏览器无响应,如果采用分片上传方式,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。

当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。

在项目中引入webuploader

第一步:引入第三方js和css

注意:也可通过安装依赖的方式,引入jquery插件

npm install jquery --save

第二步:封装Vue组件

export default{

name: 'vue-upload',

props: {

accept: {

type: Object,

default: null,

},

// 上传地址

url: {

type: String,

default: uploadUrl,

},

// 上传最大数量 默认为100

fileNumLimit: {

type: Number,

default: 1,

},

// 大小限制 默认2M

fileSingleSizeLimit: {

type: Number,

default: 1024*1024*1024*10,

},

// 上传时传给后端的参数,一般为token,key等

formData: {

type: Object,

default: null

},

// 生成formData中文件的key,下面只是个例子,具体哪种形式和后端商议

keyGenerator: {

type: Function,

default(file) {

constcurrentTime = newDate().getTime();

constkey = `${currentTime}.${file.name}`;

returnkey;

},

},

multiple: {

type: Boolean,

default: false,

},

// 上传按钮ID

uploadButton: {

type: String,

default: '',

},

},

data() {

return{

uploader: null

};

},

mounted() {

this.initWebUpload();

},

methods: {

initWebUpload() {

this.uploader = WebUploader.create({

auto: false, // 选完文件后,是否自动上传

// swf: '/static/lib/webuploader/Uploader.swf', // swf文件路径

server: this.url, // 文件接收服务端

pick: {

id: this.uploadButton, // 选择文件的按钮

multiple: this.multiple, // 是否多文件上传 默认false

label: '',

},

accept: this.getAccept(), // 允许选择文件格式。

threads:10,

fileNumLimit: this.fileNumLimit, // 限制上传个数

fileSingleSizeLimit: this.fileSingleSizeLimit, // 限制单个上传图片的大小

formData: this.formData, // 上传所需参数

chunked: true, //分片上传

chunkSize: 1024*1024*10, //分片大小

duplicate: true, // 重复上传

});

// 当有文件被添加进队列的时候,添加到页面预览

this.uploader.on('fileQueued', (file) => {

this.$emit('fileChange', file);

});

this.uploader.on('beforeFileQueued', (file) => {

this.$emit('beforeFileQueued', file);

});

this.uploader.on('uploadStart', (file) => {

console.log( this.keyGenerator)

// 在这里可以准备好formData的数据

// this.uploader.options.formData.key = this.keyGenerator(file);

});

// 文件上传过程中创建进度条实时显示。

this.uploader.on('uploadProgress', (file, percentage) => {

});

this.uploader.on('uploadSuccess', (file, response) => {

var_this=this;

this.$emit('success', file, response);

});

this.uploader.on('uploadError', (file, reason) => {

console.log(reason);

this.$emit('uploadsError', file, reason);

for(vari = 0; i < this.uploader.getFiles().length; i++) {

this.uploader.removeFile(this.uploader.getFiles()[i]);

}

this.uploader.reset();

this.initWebUpload();//初始化

});

this.uploader.on('error', (type) => {

let errorMessage = '';

if(type === 'F_EXCEED_SIZE') {

errorMessage = `文件大小不能超过${this.fileSingleSizeLimit / (1024 * 1000)}M`;

} else if(type === 'Q_EXCEED_NUM_LIMIT') {

errorMessage = '文件上传已达到最大上限数';

} else{

errorMessage = `上传出错!请检查后重新上传!错误代码${type}`;

}

console.error(errorMessage);

this.$emit('error', errorMessage);

});

this.uploader.on('uploadComplete', (file, response) => {

this.$emit('complete', file, response);

});

this.uploader.on('stopUpload', () => {

var_this=this;

_this.uploader.reset();

_this.initWebUpload();//初始化

});

this.uploader.on('uploadFinished', () => {

console.log(_this.uploader.getFiles())

});

},

getStats:function(){

return this.uploader.getStats();

},

upload(file,data) {

this.uploader.options.formData=data;//传参数

this.uploader.upload(file,data);

},

stop(file) {

this.uploader.stop(file);

},

reset(){

this.uploader.reset();

},

refresh(){

this.uploader.refresh();

},

// 取消并中断文件上传

cancelFile(file) {

this.uploader.cancelFile(file);

},

// 在队列中移除文件

removeFile(file, bool) {

this.uploader.removeFile(file, bool);

},

getFiles() {

return this.uploader.getFiles();

},

getAccept() {

return{

title: 'Videos',

extensions: 'mp4,flv,avi,wmv,ogg,rmvb,mts',

mimeTypes: '.mp4,.flv,.avi,.wmv,.ogg,.rmvb,.mts'

};

},

},

};

第三步 把第二步组件引到你的页面中,使用组件,实现分片上传

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。