<a-form-item label="上传账单:" v-bind="validateInfos.attachment">
<a-upload v-model:file-list="fileList" name="file" :multiple="true" list-type="picture-card"
:show-upload-list="true" class="avatar-uploader"
action="提交的服务器地址" :headers="headers"
@change="handleChange" @preview="handlePreview" :before-upload="beforeAvatarUpload">
<span v-if="fileList.length == 0 && showErr" class="textErr">请上传账单</span>
<div v-if="fileList.length == 0 || !fileList.length">
<loading-outlined v-if="loading"></loading-outlined>
<plus-outlined v-else></plus-outlined>
<div class="ant-upload-text">上传照片</div>
</div>
</a-upload>
<div style="color: #c9c9c9;">支持.jpg .png格式</div>
<a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
<img alt="example" style="width: 100%" :src="previewImage" />
</a-modal>
</a-form-item>
<script lang="ts">
import {
defineComponent,
ref,
onMounted,
toRaw,
reactive
} from 'vue';
import {
PlusOutlined,
LoadingOutlined
} from '@ant-design/icons-vue';
import {
message,
Form
} from 'ant-design-vue';
import * as api from '../api.js'
import {
useUserStore,
} from "/@/store/modules/user";
interface FileItem {
uid: string;
name ? : string;
status ? : string;
response ? : string;
url ? : string;
type ? : string;
size: number;
originFileObj: any;
}
interface FileInfo {
file: FileItem;
fileList: FileItem[];
}
function getBase64(file: File) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
export default defineComponent({
props: ['visible', 'id'],
components: {
LoadingOutlined,
PlusOutlined,
},
setup(props, {
emit
}) {
let showErr = ref < boolean > (false);
const userStore = useUserStore();
const token = userStore.getToken;
const headers = "Bearer " + token
const fileList = ref([]);
const loading = ref < boolean > (false);
const previewVisible = ref < boolean > (false);
const previewImage = ref < string | undefined > ('');
const handleChange = (info: FileInfo) => {
if (!info.file.status) {
fileList.value = []
return
}
fileList.value = info.fileList.slice(-1)
if (info.file.status === 'uploading') {
loading.value = true;
return;
}
if (info.file.status === 'done') {
loading.value = false;
formData.attachment = {
fileName: info.file.name,
url: info.file.response.data
}
console.log(formData.attachment)
}
if (info.file.status === 'error') {
loading.value = false;
message.error('upload error');
}
};
const handlePreview = async (file: FileItem) => {
if (!file.url && !file.preview) {
file.preview = (await getBase64(file.originFileObj)) as string;
}
previewImage.value = file.preview;
previewVisible.value = true;
};
const handleCancel = () => {
previewVisible.value = false;
};
const beforeAvatarUpload = (file) => {
if (file.type.indexOf("image") == 0) {
const isLt1m = file.size / 1024 / 1024 < 0.98;
if(isLt1m) return
return new Promise(resolve => {
let reader = new FileReader(),
img = new Image();
reader.readAsDataURL(file);
reader.onload = function(e) {
img.src = e.target.result;
};
img.onload = function() {
let canvas = document.createElement('canvas');
let context = canvas.getContext('2d');
let originWidth = this.width;
let originHeight = this.height;
var maxWidth = 1000,
maxHeight = 1000;
var targetWidth = originWidth,
targetHeight = originHeight;
if (originWidth > maxWidth || originHeight > maxHeight) {
if (originWidth / originHeight > maxWidth / maxHeight) {
targetWidth = maxWidth;
targetHeight = Math.round(maxWidth * (originHeight /
originWidth));
} else {
targetHeight = maxHeight;
targetWidth = Math.round(maxHeight * (originWidth /
originHeight));
}
}
canvas.width = targetWidth;
canvas.height = targetHeight;
context.clearRect(0, 0, targetWidth, targetHeight);
context.drawImage(img, 0, 0, targetWidth, targetHeight);
canvas.toBlob(
blob => {
let imgFile = new File([blob], file.name, {
type: file.type
});
resolve(imgFile);
},
file.type,
0.2
);
};
});
} else {
message.error("上传图片只能是 .jpg和.png 格式!");
return false;
}
}
return {
headers: {
authorization: headers,
},
fileList,
loading,
handleChange,
handlePreview,
previewVisible,
previewImage,
handleCancel,
beforeAvatarUpload,
showErr,
};
},
});
</script>