1、html标签
<template>
<span>
<!-- :on-change="handelChange"-->
<el-upload
class="upload-demo"
name="file"
ref="upload"
:headers="fileHeaders"
:action="uploadApi"
multiple
:accept="fileType"
:limit="limit"
// 这里的value是双向绑定用的
:file-list='value'
:before-upload="handleBeforeUpload"
:on-success="handelSuccess"
:on-exceed="handleExceed"
:before-remove="beforeRemove"
:on-preview="handlePreview"
:on-error="handelError"
:on-remove="handelRemove">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</span>
</template>
2、script标签的使用
<script>
import Cookies from 'js-cookie';
import prefix from '@/utils/config/prefix';
import { downFile, filePreView } from '@/utils/common';
const baseUrl = prefix.thirdApi;
const acceptFileTypeWhiteStr = 'xls,xlsx,doc,docx,txt,pdf,ppt,pptx,rar,zip,arj,gz,z,bmp,gif,jpg,jpeg,pic,png,tif,mp4';
export default {
name: 'index',
props: {
uploadApi: {
type: String,
default: `${baseUrl}storage/saveFile`,
},
exportApi: {
type: String,
default: `${baseUrl}storage/getFile`,
},
preViewApi: {
type: String,
default: `${baseUrl}storage/previewFile`,
},
limit: {
type: Number,
default: 5,
},
limitFileSize: {
type: Number,
default: 50,
},
acceptType: {
type: String,
default: acceptFileTypeWhiteStr,
},
value: {
type: Array,
default: () => [],
},
},
data() {
return {
fileType: '.xls,.xlsx,.doc,.docx,.txt,.pdf,.ppt,.pptx,.rar,.zip,.arj,.bmp,.gif,.jpg,.jpeg,.pic,.png,.tif,.mp4',
fileHeaders: {
Authorization: Cookies.get('accessToken'),
},
};
},
methods: {
##
handleBeforeUpload(file) {
const fileName = file.name.substring(0, file.name.lastIndexOf('.'));
const reg = /([*"'<>/])+/;
if (this.acceptType) {
const fileType = file.name.substring(file.name.lastIndexOf('.') + 1);
const acceptArr = this.acceptType.split(',');
const valid = acceptArr.join('、');
if (acceptArr.indexOf(fileType.toLowerCase()) === -1) {
this.$message({
message: `上传文件只能是${valid} 格式!`,
type: 'warning',
});
return false;
}
}
if (reg.test(fileName) || fileName.indexOf(' ') === 0 || (fileName.lastIndexOf(' ') === fileName.length - 1)) {
this.$message.error('文件名称不符合规范!');
return false;
}
if (this.limitFileSize) {
const { size } = file;
let limitSize = this.limitFileSize * 1024 * 1024;
if (file.type.indexOf('mp4') !== -1) {
limitSize = 200 * 1024 * 1024;
}
if (size > limitSize) {
this.$message({
message: `文件大小限制${this.limitFileSize}M以内,当前文件大小${Math.round((size / 1024 / 1024) * 100) / 100}M!`,
type: 'warning',
});
return false;
}
}
},
##
handelSuccess(response, file, fileList) {
if (response.code === 200) {
this.$message.success('上传成功');
this.$emit('input', fileList);
} else {
const delFileName = file.name;
let selectFiles = this.$refs.upload.$children[1].files;
selectFiles.some((v, idx) => {
const flag = v.name === delFileName;
if (flag) {
selectFiles = selectFiles.splice(idx, 1);
}
return flag;
});
this.$message.error('上传失败');
}
},
##
handelError(err, file, fileList) {
this.$message.error(`${err}`);
},
##
beforeRemove(file, fileList, type = 'confirm') {
if (file && file.status === 'success' && type === 'confirm') {
return new Promise((resolve, reject) => {
this.$confirm('确定删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
resolve(true);
}).catch(() => {
reject(false);
});
});
}
return true;
},
##
handelRemove(file, fileList) {
this.$emit('input', fileList);
},
##
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 ${this.limit} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length
+ fileList.length} 个文件`,
);
},
##
handlePreview(file) {
this.$confirm('请选择您所需要的操作?', '提示', {
confirmButtonText: '下载',
cancelButtonText: '预览',
distinguishCancelAndClose: true,
closeOnClickModal: false,
type: 'warning',
}).then(() => {
if (file && file.status === 'success') {
let params;
if (file.response && file.response.content) {
params = { id: file.response.content };
} else {
params = { id: file.filePath };
}
downFile(this.exportApi, params, file, 'get');
}
}).catch((action) => {
if (action === 'cancel') {
const fileList = 'xls,xlsx,doc,docx,txt,pdf,ppt,pptx,gif,jpg,jpeg,pic,png,';
if (file && file.status === 'success') {
const fileType = file.name.substring(file.name.lastIndexOf('.') + 1);
if (fileList.indexOf(fileType) > -1) {
const params = {
id: file?.response?.content || file.filePath,
};
filePreView(this.preViewApi, params);
} else {
this.$message.warning(`当前仅支持${fileList}文件预览`);
}
}
}
});
},
},
};
</script>
3、文件预览下载的公共方法
const downFilejx = (res:any, file:any) => {
const blob = new Blob([res.data], { type: 'application/actet-stream;charset=utf-8' });
const contentDisposition = res.headers['content-disposition'];
const patt = new RegExp('filename=([^;]+\.[^\.;]+);*');
const result = patt.exec(contentDisposition);
const filename = common.toDecodeURIComponent(result[1]);
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
const downloadElement = document.createElement('a');
const href = window.URL.createObjectURL(blob);
downloadElement.style.display = 'none';
downloadElement.href = href;
downloadElement.download = filename;
document.body.appendChild(downloadElement);
downloadElement.click();
document.body.removeChild(downloadElement);
window.URL.revokeObjectURL(href);
}
};
export function downFile(url:any, params:any, file:any, type:any) {
if (type === 'post') {
outHttpClient.post(url, params, { responseType: 'blob' }).then((res) => {
downFilejx(res, file);
});
}
if (type === 'get') {
outHttpClient.get(url, {
params,
responseType: 'blob',
}).then((res) => {
downFilejx(res, file);
});
}
}
export function filePreView(api: string, params: any) {
outHttpClient.get(api, {
params,
}).then((res:any) => {
const aEle = document.createElement('a');
aEle.setAttribute('href', res);
aEle.setAttribute('target', '_blank');
aEle.setAttribute('id', 'previewJumpEle');
if (!document.getElementById('previewJumpEle')) {
document.body.appendChild(aEle);
}
aEle.click();
(aEle.remove && aEle.remove()) || (aEle.removeNode && aEle.removeNode(true));
}).catch((err) => {
Message.error(`${err}`);
});
}