import os import re import json import logging from werkzeug.utils import secure_filename from flask import current_app ALLOWED_EXTENSIONS = {"pdf", "jpg", "jpeg", "png", "svg", "docx", "doc", "xlsx", "xls", "wav", "mp3", "m4a", "ogg"} MAX_SIZE_PDF_DOCS = 1 * 1024 * 1024 * 1024 # 1GB MAX_SIZE_IMAGES = 500 * 1024 * 1024 # 500MB MAX_SIZE_AUDIO = 100 * 1024 * 1024 # 100MB def allowed_file(filename): return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS def check_file_size(file): try: # Store current position current_pos = file.tell() # Check size file.seek(0, os.SEEK_END) size = file.tell() # Return to original position file.seek(current_pos) extension = file.filename.rsplit('.', 1)[-1].lower() if extension in {"pdf", "docx"} and size > MAX_SIZE_PDF_DOCS: return False, f"File {file.filename} exceeds 1GB size limit" elif extension in {"jpg", "jpeg", "png"} and size > MAX_SIZE_IMAGES: return False, f"Image {file.filename} exceeds 500MB size limit" elif extension in {"wav", "mp3", "m4a", "ogg"} and size > MAX_SIZE_AUDIO: return False, f"Audio file {file.filename} exceeds 100MB size limit" return True, None except Exception as e: logging.error(f"Error checking file size: {e}", exc_info=True) return False, f"Error checking file size: {str(e)}" def save_data_to_storage(filename, data): try: upload_folder = current_app.config.get("UPLOAD_FOLDER", "uploads") if not os.path.exists(upload_folder): os.makedirs(upload_folder, exist_ok=True) filename = filename.rsplit(".", 1)[0] filepath = os.path.join(upload_folder, f"{filename}.json") with open(filepath, "w") as file: json.dump(data, file) except Exception as e: logging.error(f"Exception during save: {e}") def get_data_from_storage(filename): try: upload_folder = current_app.config.get("UPLOAD_FOLDER", "uploads") filepath = os.path.join(upload_folder, f"{filename}.json") if not os.path.exists(filepath): return None with open(filepath, "r") as file: data = json.load(file) return data except Exception as e: logging.error(f"Error loading data: {e}") return None