from pymongo import MongoClient import gridfs from bson import ObjectId import os from io import BytesIO import magic def connect_mongodb(db_name, collection_name): client = MongoClient("mongodb+srv://admin:1highbar456@cluster0.equkm.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0") db = client[db_name] fs = gridfs.GridFS(db, collection=collection_name) return fs def save_file_to_mongodb(uploaded_file, db_name="ppt", collection_name="root_file"): """ Lưu file vào MongoDB bằng GridFS mà không kiểm tra trùng lặp. :param uploaded_file: đối tượng UploadedFile từ Streamlit :param db_name: Tên database trong MongoDB :param collection_name: Tên collection GridFS :param file_tail: Phần mở rộng mặc định của file nếu không có :return: file_id nếu lưu thành công """ client = MongoClient("mongodb+srv://admin:1highbar456@cluster0.equkm.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0") db = client[db_name] fs = gridfs.GridFS(db, collection=collection_name) # Xác định tên file file_name = uploaded_file.name # Đảm bảo con trỏ file đang ở đầu uploaded_file.seek(0) file_bytes = uploaded_file.read() # Lưu file vào MongoDB (không kiểm tra trùng lặp) file_id = fs.put(file_bytes, filename=file_name) print(f"✅ File '{file_name}' đã được lưu vào '{collection_name}' với ID: {file_id}") client.close() return file_id, file_name def save_xml_to_gridfs(xml_content, file_name, db_name="ppt", collection_name="original_xml"): """ Lưu XML vào MongoDB GridFS. :param xml_content: Chuỗi XML cần lưu :param file_name: Tên file XML :param db_name: Tên database MongoDB :param collection_name: Tên collection GridFS """ client = MongoClient("mongodb+srv://admin:1highbar456@cluster0.equkm.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0") db = client[db_name] fs = gridfs.GridFS(db, collection=collection_name) # Kiểm tra file đã tồn tại chưa existing_file = fs.find_one({"filename": file_name}) if existing_file: print(f"⚠️ File '{file_name}' đã tồn tại trong GridFS. Không lưu lại.") return # Chuyển đổi chuỗi XML thành bytes và lưu vào GridFS file_id = fs.put(xml_content.encode("utf-8"), filename=file_name) print(f"✅ XML '{file_name}' đã được lưu vào GridFS với ID: {file_id}") def fetch_file_from_mongodb(db_name, collection_name, file_id): client = MongoClient("mongodb+srv://admin:1highbar456@cluster0.equkm.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0") # Cập nhật nếu cần db = client[db_name] fs = gridfs.GridFS(db, collection_name) try: file_data = fs.get(file_id) pptx_io = BytesIO(file_data.read()) pptx_io.seek(0) # Đặt lại vị trí đầu file return pptx_io, file_data.filename except Exception as e: print(f"Lỗi khi lấy file từ MongoDB: {e}") return None, None def detect_file_type(uploaded_file): if uploaded_file is not None: try: # Ưu tiên kiểm tra phần mở rộng trước ext = os.path.splitext(uploaded_file.name)[1].lower() ext_mapping = { ".csv": "CSV", ".docx": "Word", ".doc": "Word", ".xlsx": "Excel", ".pptx": "PPTX", ".pdf": "PDF" } detected_type = ext_mapping.get(ext) if detected_type: return detected_type # Nếu có trong danh sách, trả về ngay # Nếu không có phần mở rộng hợp lệ, fallback vào MIME type file_bytes = uploaded_file.read(4096) mime = magic.Magic(mime=True) file_type = mime.from_buffer(file_bytes) mime_types = { "application/pdf": "PDF", "application/vnd.ms-powerpoint": "PPTX", "application/vnd.openxmlformats-officedocument.presentationml.presentation": "PPTX", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "Excel", "application/vnd.ms-excel": "Excel", "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "Word", "application/msword": "Word", "text/csv": "CSV", "text/plain": "CSV" } return mime_types.get(file_type, "Unknown") except Exception as e: print(f"Error detecting file type: {e}") return "Unknown" return None