/**
* Validates file data for backward compatibility, handling edge cases.
*
* @param {File} file The file to validate.
* @param {string} expectedType The expected file type (e.g., 'text/plain', 'application/json').
* @param {object} options Optional validation parameters.
* @returns {object} An object containing validation results: { valid: boolean, message: string }.
*/
function validateFileData(file, expectedType, options = {}) {
if (!file) {
return { valid: false, message: 'File is required.' };
}
const fileType = file.type;
const fileName = file.name;
const fileSize = file.size;
// Check file type. Handle potential MIME type variations.
const isValidType = fileType === expectedType || (options.allowMimeVariations && options.mimeVariations.includes(fileType));
if (!isValidType) {
return { valid: false, message: `Invalid file type. Expected: ${expectedType}, Got: ${fileType}` };
}
// Check file size. Handle very large files to prevent memory issues.
if (options.maxFileSize && fileSize > options.maxFileSize) {
return { valid: false, message: `File size exceeds the limit (${options.maxFileSize} bytes).` };
}
// Check file name (optional). Prevent potentially harmful file names.
if (options.allowedFileNameRegex) {
const regex = new RegExp(options.allowedFileNameRegex);
if (!regex.test(fileName)) {
return { valid: false, message: `Invalid file name. Must match pattern: ${options.allowedFileNameRegex}` };
}
}
//Basic content validation - check if it's at least a certain size
if (options.minFileSize && fileSize < options.minFileSize) {
return {valid: false, message: `File is too small. Minimum size ${options.minFileSize} bytes required.`}
}
return { valid: true, message: 'File is valid.' };
}
Add your comment