f
This commit is contained in:
@@ -181,17 +181,17 @@
|
||||
<span v-if="field.required" class="text-red-500 ml-1">*</span>
|
||||
</label>
|
||||
|
||||
<!-- 图片上传字段(photo_data) -->
|
||||
<div v-if="field.name === 'photo_data' || field.name === 'vlphoto_data' && field.type === 'textarea'" class="space-y-2">
|
||||
<!-- Base64字段上传(根据后端校验规则自动识别) -->
|
||||
<div v-if="isBase64UploadField(field)" class="space-y-2">
|
||||
<div class="flex gap-2 mb-2">
|
||||
<el-upload
|
||||
:auto-upload="false"
|
||||
:show-file-list="false"
|
||||
accept="image/jpeg,image/jpg,image/png,image/bmp"
|
||||
:on-change="(file) => handleImageUpload(file, field.name)"
|
||||
:accept="getUploadAcceptByField(field)"
|
||||
:on-change="(file) => handleImageUpload(file, field.name, field)"
|
||||
class="flex-1">
|
||||
<el-button type="primary" size="small">
|
||||
<i class="el-icon-upload"></i> 上传图片(JPG/BMP/PNG)
|
||||
<i class="el-icon-upload"></i> {{ getUploadButtonTextByField(field) }}
|
||||
</el-button>
|
||||
</el-upload>
|
||||
<el-button v-if="formData[field.name]" type="danger" size="small" @click="clearImageData(field.name)">
|
||||
@@ -934,21 +934,48 @@ const loadFormConfig = async (apiCode) => {
|
||||
}
|
||||
}
|
||||
|
||||
// 处理图片上传并转换为base64
|
||||
const handleImageUpload = (file, fieldName) => {
|
||||
const getFieldValidationText = (field) => {
|
||||
return typeof field?.validation === 'string' ? field.validation : ''
|
||||
}
|
||||
|
||||
const isBase64ImageOnlyField = (field) => {
|
||||
return getFieldValidationText(field).includes('Base64图片')
|
||||
}
|
||||
|
||||
const isBase64UploadField = (field) => {
|
||||
if (field?.type !== 'textarea') return false
|
||||
const validationText = getFieldValidationText(field)
|
||||
return validationText.includes('Base64图片') || validationText.includes('Base64编码') || validationText.toLowerCase().includes('base64')
|
||||
}
|
||||
|
||||
const getUploadAcceptByField = (field) => {
|
||||
if (isBase64ImageOnlyField(field)) {
|
||||
return 'image/jpeg,image/jpg,image/png,image/bmp'
|
||||
}
|
||||
return 'image/jpeg,image/jpg,image/png,image/bmp,application/pdf,.pdf'
|
||||
}
|
||||
|
||||
const getUploadButtonTextByField = (field) => {
|
||||
return isBase64ImageOnlyField(field) ? '上传图片(JPG/BMP/PNG)' : '上传文件(JPG/BMP/PNG/PDF)'
|
||||
}
|
||||
|
||||
// 处理文件上传并转换为base64(支持按字段规则限制类型)
|
||||
const handleImageUpload = (file, fieldName, field) => {
|
||||
const fileObj = file.raw || file
|
||||
|
||||
// 验证文件类型
|
||||
const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/bmp']
|
||||
const allowedTypes = isBase64ImageOnlyField(field)
|
||||
? ['image/jpeg', 'image/jpg', 'image/png', 'image/bmp']
|
||||
: ['image/jpeg', 'image/jpg', 'image/png', 'image/bmp', 'application/pdf']
|
||||
if (!allowedTypes.includes(fileObj.type)) {
|
||||
ElMessage.error('只支持 JPG、BMP、PNG 格式的图片')
|
||||
ElMessage.error(isBase64ImageOnlyField(field) ? '只支持 JPG、BMP、PNG 格式的图片' : '只支持 JPG、BMP、PNG、PDF 格式的文件')
|
||||
return false
|
||||
}
|
||||
|
||||
// 验证文件大小(限制为5MB)
|
||||
const maxSize = 5 * 1024 * 1024 // 5MB
|
||||
if (fileObj.size > maxSize) {
|
||||
ElMessage.error('图片大小不能超过 5MB')
|
||||
ElMessage.error('文件大小不能超过 5MB')
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -959,10 +986,10 @@ const handleImageUpload = (file, fieldName) => {
|
||||
// 移除 data:image/xxx;base64, 前缀,只保留纯base64数据
|
||||
const base64Data = base64String.includes(',') ? base64String.split(',')[1] : base64String
|
||||
formData.value[fieldName] = base64Data
|
||||
ElMessage.success('图片上传成功,已转换为base64')
|
||||
ElMessage.success('文件上传成功,已转换为base64')
|
||||
}
|
||||
reader.onerror = () => {
|
||||
ElMessage.error('图片读取失败,请重试')
|
||||
ElMessage.error('文件读取失败,请重试')
|
||||
}
|
||||
reader.readAsDataURL(fileObj)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user