ALLOWED_IMAGE_EXTENSIONS = {"svg", "png", "jpg", "jpeg", "webp"} MAX_FILE_SIZE_MB = 5 MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024 def validate_image_file(file): """ Validate file ảnh trước khi upload lên MinIO/S3. Hàm này kiểm tra: 1. Có file được gửi lên không 2. File có tên không 3. File có extension không 4. Extension có hợp lệ không 5. File có vượt quá dung lượng cho phép không Trả về: - extension của file nếu hợp lệ Raise: - ValueError nếu file không hợp lệ """ if file is None: raise ValueError("No file uploaded") if file.filename == "": raise ValueError("Filename is empty") if "." not in file.filename: raise ValueError("File must have an extension") extension = file.filename.rsplit(".", 1)[1].lower() if extension not in ALLOWED_IMAGE_EXTENSIONS: raise ValueError("Invalid image type. Allowed: svg, png, jpg, jpeg, webp") # Di chuyển con trỏ file tới cuối để đo dung lượng file. file.seek(0, 2) file_size = file.tell() # Đưa con trỏ file về đầu để lát nữa upload không bị mất dữ liệu. file.seek(0) if file_size > MAX_FILE_SIZE_BYTES: raise ValueError(f"File size must be less than {MAX_FILE_SIZE_MB}MB") return extension