shared/fileUploadUtils.ts (64 lines of code) (raw):
export const base64FromFile = (file: File) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener(
'load',
() => {
resolve(
removeDataUrlDeclarationFromBase64(reader.result as string),
);
},
false,
);
reader.addEventListener(
'error',
() => {
reject(new Error('base64FromFile error'));
},
false,
);
reader.readAsDataURL(file);
});
};
export const MAX_FILE_ATTACHMENT_SIZE_KB = 5000;
export const MAX_AVATAR_FILE_SIZE_KB = 1000;
export const VALID_IMAGE_FILE_MIME_TYPES: string[] = [
'image/png',
'image/jpeg',
'image/jpg',
'image/gif',
'application/pdf',
];
export const VALID_IMAGE_FILE_EXTENSIONS: string[] = [
'.png',
'.jpeg',
'.jpg',
'.gif',
'.pdf',
];
export type FileAttachment = {
name: string;
type: string;
contents: string;
};
export const validateFileAttachment = (
payload: FileAttachment,
maxFileSize: number = MAX_FILE_ATTACHMENT_SIZE_KB,
) =>
validateBase64FileSize(payload.contents, maxFileSize) &&
validateImageFileExtension(payload.name);
export const validateBase64FileSize = (
fileBase64: string,
maxFileSize: number = MAX_FILE_ATTACHMENT_SIZE_KB,
) => {
// calculate the file size of the image based on the base64 string, as per:
// https://softwareengineering.stackexchange.com/questions/288670/know-file-size-with-a-base64-string
const fileSizeInKb = (fileBase64.length * (3 / 4)) / 1024;
return fileSizeInKb <= maxFileSize;
};
export const validateImageFileExtension = (fileName: string) =>
VALID_IMAGE_FILE_EXTENSIONS.filter((validFileExtension) =>
fileName.endsWith(validFileExtension),
).length > 0;
const removeDataUrlDeclarationFromBase64 = (fileBase64: string) =>
fileBase64.replace(/data:(.*)base64,/m, '');
export const base64ToBlob = (base64: string) =>
new Blob([Buffer.from(base64, 'base64')]);