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