1. /**
  2. * Validates file data for backward compatibility, handling edge cases.
  3. *
  4. * @param {File} file The file to validate.
  5. * @param {string} expectedType The expected file type (e.g., 'text/plain', 'application/json').
  6. * @param {object} options Optional validation parameters.
  7. * @returns {object} An object containing validation results: { valid: boolean, message: string }.
  8. */
  9. function validateFileData(file, expectedType, options = {}) {
  10. if (!file) {
  11. return { valid: false, message: 'File is required.' };
  12. }
  13. const fileType = file.type;
  14. const fileName = file.name;
  15. const fileSize = file.size;
  16. // Check file type. Handle potential MIME type variations.
  17. const isValidType = fileType === expectedType || (options.allowMimeVariations && options.mimeVariations.includes(fileType));
  18. if (!isValidType) {
  19. return { valid: false, message: `Invalid file type. Expected: ${expectedType}, Got: ${fileType}` };
  20. }
  21. // Check file size. Handle very large files to prevent memory issues.
  22. if (options.maxFileSize && fileSize > options.maxFileSize) {
  23. return { valid: false, message: `File size exceeds the limit (${options.maxFileSize} bytes).` };
  24. }
  25. // Check file name (optional). Prevent potentially harmful file names.
  26. if (options.allowedFileNameRegex) {
  27. const regex = new RegExp(options.allowedFileNameRegex);
  28. if (!regex.test(fileName)) {
  29. return { valid: false, message: `Invalid file name. Must match pattern: ${options.allowedFileNameRegex}` };
  30. }
  31. }
  32. //Basic content validation - check if it's at least a certain size
  33. if (options.minFileSize && fileSize < options.minFileSize) {
  34. return {valid: false, message: `File is too small. Minimum size ${options.minFileSize} bytes required.`}
  35. }
  36. return { valid: true, message: 'File is valid.' };
  37. }

Add your comment