赞
踩
vue配合webuploader分片上传
啥也不说,献上代码
封装upload.vue:
<template> <div class="upload"></div> </template> <script> import WebUploader from ".././../../../static/js/webuploader.min"; import { httpUrl } from "../../../api/http_url"; import { v4 as uuidv4 } from "uuid"; import md5 from "js-md5"; export default { name: "vue-upload", props: { accept: { type: Object, default: null }, // 上传地址 url: { type: String, default: httpUrl.fenP }, // 上传最大数量 默认为100 fileNumLimit: { type: Number, default:1000000 }, // 大小限制 默认2M fileSingleSizeLimit: { type: Number, default: 5 * 1024 * 1024 }, // 上传时传给后端的参数,一般为token,key等 formData: { type: Object, default: { // md5:this.uploader.md5File( files ) md5: null } }, // 生成formData中文件的key,下面只是个例子,具体哪种形式和后端商议 // keyGenerator: { // type: Function, // default(file) { // const currentTime = new Date().getTime(); // const md5 = md5(file.name) // return md5; // } // }, multiple: { type: Boolean, default: true }, // 上传按钮ID uploadButton: { type: String, default: httpUrl.fenP }, }, data() { return { uploader: null, md5: null, imgAideo:[] }; }, mounted() { this.initWebUpload(); }, methods: { initWebUpload() { // var md5 = uuidv4(); // this.formData.md5 = md5; // sessionStorage.setItem("md5", md5); const _this = this this.uploader = WebUploader.create({ auto: true, // 选完文件后,是否自动上传 swf: "/static/lib/webuploader/Uploader.swf", // swf文件路径 server: this.url, // 文件接收服务端 pick: { id: this.uploadButton, // 选择文件的按钮 multiple: this.multiple, // 是否多文件上传 默认false label: "" }, accept: this.getAccept(this.accept), // 允许选择文件格式。 threads:1, fileNumLimit: this.fileNumLimit, // 限制上传个数 //fileSingleSizeLimit: this.fileSingleSizeLimit, // 限制单个上传图片的大小 formData: this.formData, // 上传所需参数 chunked: true, //分片上传 chunkSize: this.fileSingleSizeLimit, //分片大小 resize : false, duplicate: true // 重复上传 }); // 当有文件被添加进队列的时候,添加到页面预览 this.uploader.on("fileQueued", file => { this.$emit("fileChange", file); }); this.uploader.on("uploadStart", file => { // 在这里可以准备好formData的数据 this.uploader.options.formData.md5 = md5(file.name); }); // 文件上传过程中创建进度条实时显示。 this.uploader.on("uploadProgress", (file, percentage) => { this.$emit("progress", file, percentage); }); this.uploader.on("uploadSuccess", (file, response) => { this.$emit("success", file, response); }); this.uploader.on("uploadError", (file, reason) => { console.error(reason); this.$emit("uploadError", file, reason); }); this.uploader.on("error", type => { let errorMessage = ""; if (type === "F_EXCEED_SIZE") { this.$message.error( `文件大小不能超过${this.fileSingleSizeLimit / (1024 * 1000)}M` ); } else if (type === "Q_EXCEED_NUM_LIMIT") { this.$message.error("文件上传已达到最大上限数"); } else { this.$message.error(`上传出错!请检查后重新上传!错误代码${type}`); } console.error(errorMessage); this.$emit("error", errorMessage); }); this.uploader.on("uploadComplete", (file, response) => { this.$emit("finshed", file); }); }, upload(file) { this.uploader.upload(file); }, stop(file) { this.uploader.stop(file); }, cancelFile(file) { this.uploader.cancelFile(file); }, removeFile(file, bool) { this.uploader.removeFile(file, bool); }, getAccept(accept) { switch (accept) { case "video": return { title: "Videos", exteensions: "mp4,mp3,avi", mimeTypes: ".mp4,.mp3,.avi" }; break; case "image": return { title: "Images", exteensions: "gif,jpg,jpeg,bmp,png,webp,jfif", mimeTypes: ".gif,.jpg,.jpeg,.bmp,.png,.webp,.jfif" }; break; default: return accept; } } } }; </script> <style scoped> </style> 父组件:
import vueUpload from “./upload”;//组件
import WebUploader from “…/…/…/…/static/js/webuploader.min”;
mounted() {
setTimeout(() => {
document.getElementsByClassName(
“webuploader-element-invisible”
)[0].style.display = “none”;
}, 10);
},
computed: {
uploader() {
return this.$refs.uploader;
}
},
components: {
vueUpload,
uploader() {
return this.$refs.uploader;
}
},
//调取方法
fileChange(file) {
this.fileList.push(file);
},
onProgress(file, percent) {
if (this.imgs.length > 8) {
this.loading = false;
} else {
this.loading = true;
}
},
onSuccess(file, response) {
this.getImg(file);
},
getImg(file) { if (this.imgs.length > 8) { this.$message.error("最多可上传9张"); this.loading = false; } else { var qs = require("qs"); var a = md5(file.name); this.$axios .post( httpUrl.merge, qs.stringify({ md5: a, fileName: a + "." + file.ext }) ) .then(res => { this.loading = false; if (res.data.code == 1) { this.$message.success("上传成功"); this.imgs.push({ img: res.data.data, id: file }); } else { this.loading = false; this.$message.error(res.data.msg_cn); } }); } }, fileSize(size) { return WebUploader.Base.formatSize(size); }, fileCategory(ext) { let type = ""; const typeMap = { image: ["gif", "jpg", "jpeg", "png", "bmp", "webp", "jfif"], video: ["mp4", "mp3", "avi"], text: [] }; Object.keys(typeMap).forEach(_type => { const extensions = typeMap[_type]; if (extensions.indexOf(ext) > -1) { type = _type; } }); return type; },
官方文档:http://fex.baidu.com/webuploader/document.html
里面都有方法介绍哦,代码中httpUrl.fenp是后台分片接口哦,httpUrl.merge是后台合并上传哦
不详细,仅供参考,生活不易,小杨叹气!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。