From a25bd8f4b0f20c351d52f1703ba204ae392709d0 Mon Sep 17 00:00:00 2001 From: ShareVB Date: Sun, 25 Feb 2024 12:35:46 +0100 Subject: [PATCH] feat(base64 file converter): add a preview image Fix #594. Taken from #595 (thanks @SAF2k) --- src/composable/downloadBase64.ts | 24 +++++++++++++++ .../base64-file-converter.vue | 30 +++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/composable/downloadBase64.ts b/src/composable/downloadBase64.ts index 367c6a3e..3bc20226 100644 --- a/src/composable/downloadBase64.ts +++ b/src/composable/downloadBase64.ts @@ -6,6 +6,7 @@ export { getMimeTypeFromBase64, getMimeTypeFromExtension, getExtensionFromMimeType, useDownloadFileFromBase64, useDownloadFileFromBase64Refs, + previewImageFromBase64, }; const commonMimeTypesSignatures = { @@ -92,3 +93,26 @@ function useDownloadFileFromBase64Refs( }, }; } + +function previewImageFromBase64(base64String: string): HTMLImageElement { + if (base64String === '') { + throw new Error('Base64 string is empty'); + } + + const img = document.createElement('img'); + img.src = base64String; + + const container = document.createElement('div'); + container.appendChild(img); + + const previewContainer = document.getElementById('previewContainer'); + if (previewContainer) { + previewContainer.innerHTML = ''; + previewContainer.appendChild(container); + } + else { + throw new Error('Preview container element not found'); + } + + return img; +} diff --git a/src/tools/base64-file-converter/base64-file-converter.vue b/src/tools/base64-file-converter/base64-file-converter.vue index 261d419a..a489f9a1 100644 --- a/src/tools/base64-file-converter/base64-file-converter.vue +++ b/src/tools/base64-file-converter/base64-file-converter.vue @@ -2,7 +2,7 @@ import { useBase64 } from '@vueuse/core'; import type { Ref } from 'vue'; import { useCopy } from '@/composable/copy'; -import { getExtensionFromMimeType, getMimeTypeFromBase64, useDownloadFileFromBase64Refs } from '@/composable/downloadBase64'; +import { getExtensionFromMimeType, getMimeTypeFromBase64, previewImageFromBase64, useDownloadFileFromBase64Refs } from '@/composable/downloadBase64'; import { useValidation } from '@/composable/validation'; import { isValidBase64 } from '@/utils/base64'; @@ -35,6 +35,25 @@ watch( }, ); +function previewImage() { + if (!base64InputValidation.isValid) { + return; + } + try { + const image = previewImageFromBase64(base64Input.value); + image.style.maxWidth = '100%'; + image.style.maxHeight = '400px'; + const previewContainer = document.getElementById('previewContainer'); + if (previewContainer) { + previewContainer.innerHTML = ''; + previewContainer.appendChild(image); + } + } + catch (_) { + // + } +} + function downloadFile() { if (!base64InputValidation.isValid) { return; @@ -88,7 +107,14 @@ async function onUpload(file: File) { mb-2 /> -
+
+
+
+ +
+ + Preview image + Download file