Spaces:
Running
Running
File size: 4,739 Bytes
0e9ff78 6ae64ab 0e9ff78 e53f591 0e9ff78 fad6c52 0e9ff78 fad6c52 0e9ff78 6ae64ab 0e9ff78 fad6c52 0e9ff78 fad6c52 0e9ff78 fad6c52 0e9ff78 73196e5 0e9ff78 6ae64ab 0e9ff78 6ae64ab 0e9ff78 d586fe1 0e9ff78 d586fe1 0e9ff78 d586fe1 0e9ff78 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
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 |