123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <template>
- <div id="upload">
- <el-upload
- v-if="url"
- ref="upload"
- :action="url"
- :list-type="listType"
- :file-list="fileList"
- :limit="limit"
- :on-exceed="outLimit"
- :on-preview="handlePictureCardPreview"
- :before-remove="handleRemove"
- :on-success="onSuccess"
- :before-upload="beforeUpload"
- :show-file-list="showList"
- :accept="accept"
- >
- <el-button size="small" type="primary" v-if="isBtn">点击上传</el-button>
- <template v-else-if="uploadBtn">
- <el-button type="danger">选择文件</el-button>
- </template>
- <template v-else>
- <el-button type="primary" size="mini">选择文件</el-button>
- </template>
- <template #tip v-if="tip">
- {{ tip }}
- </template>
- </el-upload>
- <el-dialog :visible.sync="dialogVisible" append-to-body>
- <img width="100%" :src="dialogImageUrl" alt="" />
- </el-dialog>
- </div>
- </template>
- <script>
- import _ from 'lodash';
- export default {
- name: 'upload',
- props: {
- url: { type: null },
- limit: { type: Number },
- data: { type: null },
- type: { type: String },
- isBtn: { type: Boolean, default: false },
- uploadBtn: { type: Boolean, default: false },
- showList: { type: Boolean, default: true },
- accept: { type: String, default: '' },
- tip: { type: String, default: undefined },
- listType: { type: String, default: 'picture-card' },
- file_type: { type: String, default: 'jpeg' },
- },
- components: {},
- data: () => ({
- dialogVisible: false,
- dialogImageUrl: '',
- fileList: [],
- }),
- created() {
- if (this.data) {
- this.defalutProcess(this.data);
- }
- },
- watch: {
- data: {
- handler(val) {
- this.defalutProcess(val);
- },
- },
- },
- computed: {},
- methods: {
- handlePictureCardPreview(file) {
- this.dialogImageUrl = file.url;
- this.dialogVisible = true;
- },
- handleRemove(file, fileList) {
- this.$set(this, `fileList`, []);
- // let index = fileList.findIndex(f => _.isEqual(f, file));
- this.$emit('delete', { file, type: this.type });
- return false;
- },
- outLimit() {
- this.$message.error(`只允许上传${this.limit}个文件`);
- },
- onSuccess(response, file, fileList) {
- //将文件整理好传回父组件
- this.$emit('upload', { type: this.type, data: { ...response, name: file.name } });
- },
- beforeUpload(file) {
- let setting_type = this.file_type.split('|');
- let file_type = file.type.split('/')[1];
- let isType = false;
- for (const val of setting_type) {
- if (val == file_type) isType = true;
- }
- // 文件大小改为10Mb
- const isLt20M = file.size / 1024 / 1024 < 10;
- // if (!isType) {
- // this.$message.error('图片格式不正确');
- // }
- if (!isLt20M) {
- this.$message.error('文件超出10M');
- }
- // return isType && isLt20M;
- return isLt20M;
- },
- defalutProcess(val) {
- if (_.isArray(val)) {
- let newArr = val.map(item => {
- let object = {};
- object.name = item.name;
- object.url = item.url;
- return object;
- });
- this.$set(this, `fileList`, newArr);
- } else if (_.isObject(val)) {
- let object = {};
- if (_.get(val, `url`)) {
- object.name = val.name;
- object.url = val.url;
- this.$set(this, `fileList`, [object]);
- }
- } else if (typeof val === 'string') {
- this.$set(this, `fileList`, [{ name: '附件', url: val }]);
- }
- },
- },
- };
- </script>
- <style lang="less" scoped></style>
|