Spaces:
Running
Running
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:[email protected]/?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:[email protected]/?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:[email protected]/?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:[email protected]/?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 |