MT_deploy / db /mongodb.py
mintlee's picture
update pptx
73196e5
raw
history blame
4.74 kB
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