Merge pull request #1621 from JoeBrar/fix/image-upload

fix: Changed image extension validation to MIME type validation
This commit is contained in:
Jannat Patel
2025-07-07 13:01:18 +05:30
committed by GitHub
4 changed files with 28 additions and 30 deletions

View File

@@ -209,7 +209,10 @@
v-slot="{ file, progress, uploading, openFileSelector }" v-slot="{ file, progress, uploading, openFileSelector }"
> >
<div class="flex items-center"> <div class="flex items-center">
<div class="border rounded-md w-fit py-5 px-20"> <div
class="border rounded-md w-fit py-5 px-20 cursor-pointer"
@click="openFileSelector"
>
<Image class="size-5 stroke-1 text-ink-gray-7" /> <Image class="size-5 stroke-1 text-ink-gray-7" />
</div> </div>
<div class="ml-4"> <div class="ml-4">
@@ -323,7 +326,12 @@ import { useOnboarding } from 'frappe-ui/frappe'
import { sessionStore } from '../stores/session' import { sessionStore } from '../stores/session'
import MultiSelect from '@/components/Controls/MultiSelect.vue' import MultiSelect from '@/components/Controls/MultiSelect.vue'
import Link from '@/components/Controls/Link.vue' import Link from '@/components/Controls/Link.vue'
import { openSettings, getMetaInfo, updateMetaInfo } from '@/utils' import {
openSettings,
getMetaInfo,
updateMetaInfo,
validateFile,
} from '@/utils'
const router = useRouter() const router = useRouter()
const user = inject('$user') const user = inject('$user')
@@ -539,13 +547,6 @@ const removeImage = () => {
batch.image = null batch.image = null
} }
const validateFile = (file) => {
let extension = file.name.split('.').pop().toLowerCase()
if (!['jpg', 'jpeg', 'png'].includes(extension)) {
return 'Only image file is allowed.'
}
}
const breadcrumbs = computed(() => { const breadcrumbs = computed(() => {
let crumbs = [ let crumbs = [
{ {

View File

@@ -106,7 +106,10 @@
v-slot="{ file, progress, uploading, openFileSelector }" v-slot="{ file, progress, uploading, openFileSelector }"
> >
<div class="flex items-center"> <div class="flex items-center">
<div class="border rounded-md w-fit py-5 px-20"> <div
class="border rounded-md w-fit py-5 px-20 cursor-pointer"
@click="openFileSelector"
>
<Image class="size-5 stroke-1 text-ink-gray-7" /> <Image class="size-5 stroke-1 text-ink-gray-7" />
</div> </div>
<div class="ml-4"> <div class="ml-4">
@@ -330,7 +333,12 @@ import { useRouter } from 'vue-router'
import { capture, startRecording, stopRecording } from '@/telemetry' import { capture, startRecording, stopRecording } from '@/telemetry'
import { useOnboarding } from 'frappe-ui/frappe' import { useOnboarding } from 'frappe-ui/frappe'
import { sessionStore } from '../stores/session' import { sessionStore } from '../stores/session'
import { openSettings, getMetaInfo, updateMetaInfo } from '@/utils' import {
openSettings,
getMetaInfo,
updateMetaInfo,
validateFile,
} from '@/utils'
import Link from '@/components/Controls/Link.vue' import Link from '@/components/Controls/Link.vue'
import CourseOutline from '@/components/CourseOutline.vue' import CourseOutline from '@/components/CourseOutline.vue'
import MultiSelect from '@/components/Controls/MultiSelect.vue' import MultiSelect from '@/components/Controls/MultiSelect.vue'
@@ -597,13 +605,6 @@ watch(
} }
) )
const validateFile = (file) => {
let extension = file.name.split('.').pop().toLowerCase()
if (!['jpg', 'jpeg', 'png', 'webp'].includes(extension)) {
return __('Only image file is allowed.')
}
}
const updateTags = () => { const updateTags = () => {
if (newTag.value) { if (newTag.value) {
course.tags = course.tags ? `${course.tags}, ${newTag.value}` : newTag.value course.tags = course.tags ? `${course.tags}, ${newTag.value}` : newTag.value

View File

@@ -151,7 +151,7 @@ import { computed, onMounted, reactive, inject } from 'vue'
import { FileText, X } from 'lucide-vue-next' import { FileText, X } from 'lucide-vue-next'
import { sessionStore } from '@/stores/session' import { sessionStore } from '@/stores/session'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { getFileSize } from '@/utils' import { getFileSize, validateFile } from '@/utils'
const user = inject('$user') const user = inject('$user')
const router = useRouter() const router = useRouter()
@@ -293,13 +293,6 @@ const removeImage = () => {
job.image = null job.image = null
} }
const validateFile = (file) => {
let extension = file.name.split('.').pop().toLowerCase()
if (!['jpg', 'jpeg', 'png'].includes(extension)) {
return 'Only image file is allowed.'
}
}
const jobTypes = computed(() => { const jobTypes = computed(() => {
return [ return [
{ label: 'Full Time', value: 'Full Time' }, { label: 'Full Time', value: 'Full Time' },

View File

@@ -497,10 +497,13 @@ export function singularize(word) {
) )
} }
export const validateFile = (file) => { export const validateFile = (file, showToast = true) => {
let extension = file.name.split('.').pop().toLowerCase() if (!file.type.startsWith('image/')) {
if (!['jpg', 'jpeg', 'png', 'webp'].includes(extension)) { const errorMessage = __('Only image file is allowed.')
return __('Only image file is allowed.') if (showToast) {
toast.error(errorMessage)
}
return errorMessage
} }
} }