import streamlit as st from pathlib import Path from datetime import datetime import zipfile from PIL import Image import time import humanize # تنظیمات صفحه st.set_page_config( page_title="سیستم مدیریت فایل", page_icon="💼", layout="wide", initial_sidebar_state="expanded" ) # استایل‌های سفارشی با تم چت‌بات CUSTOM_CSS = """ """ st.markdown(CUSTOM_CSS, unsafe_allow_html=True) class FileManager: def __init__(self): self.root_path = Path("uploads") self.root_path.mkdir(exist_ok=True) def get_file_info(self, filename): """دریافت اطلاعات کامل فایل""" path = self.root_path / filename stats = path.stat() return { 'size': humanize.naturalsize(stats.st_size), 'modified': datetime.fromtimestamp(stats.st_mtime).strftime('%Y/%m/%d %H:%M'), 'type': path.suffix[1:].upper(), 'icon': self._get_file_icon(path.suffix) } def _get_file_icon(self, suffix): """انتخاب آیکون مناسب برای هر نوع فایل""" icons = { '.txt': '📄', '.pdf': '📕', '.jpg': '🖼️', '.jpeg': '🖼️', '.png': '🖼️', '.gif': '🎞️', '.zip': '📦', '.mp3': '🎵', '.mp4': '🎥', '.doc': '📘', '.docx': '📘', '.xls': '📊', '.xlsx': '📊', } return icons.get(suffix.lower(), '📎') def upload_file(self, file): """آپلود فایل با نمایش پیشرفت""" try: progress_text = st.empty() progress_bar = st.progress(0) dest_path = self.root_path / file.name total_size = file.size with open(dest_path, "wb") as f: bytes_data = file.getbuffer() f.write(bytes_data) # شبیه‌سازی پیشرفت آپلود for i in range(100): time.sleep(0.01) progress = (i + 1) / 100 progress_bar.progress(progress) progress_text.text(f"در حال آپلود... {int(progress * 100)}%") progress_text.empty() progress_bar.empty() return "success", f"✅ فایل '{file.name}' با موفقیت آپلود شد" except Exception as e: return "error", f"❌ خطا در آپلود فایل: {str(e)}" def list_files(self, search_term="", file_type=None): """لیست فایل‌ها با قابلیت جستجو و فیلتر""" files = [] for f in self.root_path.iterdir(): if f.is_file(): if file_type and file_type != "همه" and f.suffix.lower() != file_type.lower(): continue if search_term and search_term.lower() not in f.name.lower(): continue files.append(f.name) return sorted(files) def preview_file(self, filename): """پیش‌نمایش پیشرفته فایل""" try: path = self.root_path / filename if path.suffix.lower() in ['.jpg', '.jpeg', '.png', '.gif']: img = Image.open(path) return "image", img elif path.suffix.lower() == '.txt': with open(path, "r", encoding="utf-8") as f: content = f.read(1000) if len(content) >= 1000: content += "\n...[ادامه متن]" return "text", content return "unsupported", "⚠️ پیش‌نمایش برای این نوع فایل در دسترس نیست" except Exception as e: return "error", f"❌ خطا در نمایش فایل: {str(e)}" def compress_files(self, files): """فشرده‌سازی فایل‌ها با نمایش پیشرفت""" try: if not files: return "error", "⚠️ لطفاً حداقل یک فایل انتخاب کنید" zip_name = f"compressed_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip" zip_path = self.root_path / zip_name progress_text = st.empty() progress_bar = st.progress(0) with zipfile.ZipFile(zip_path, 'w') as zipf: for i, file in enumerate(files, 1): file_path = self.root_path / file zipf.write(file_path, file) progress = i / len(files) progress_bar.progress(progress) progress_text.text(f"در حال فشرده‌سازی... {int(progress * 100)}%") progress_text.empty() progress_bar.empty() return "success", f"✅ فایل‌ها با موفقیت در '{zip_name}' فشرده شدند" except Exception as e: return "error", f"❌ خطا در فشرده‌سازی: {str(e)}" def main(): st.markdown('
', unsafe_allow_html=True) st.title("💼 سیستم مدیریت فایل پیشرفته") file_manager = FileManager() # بخش آپلود فایل st.markdown("""

📤 آپلود فایل

فایل خود را اینجا رها کنید یا کلیک کنید

""", unsafe_allow_html=True) uploaded_file = st.file_uploader( "", type=["jpg", "jpeg", "png", "gif", "txt", "pdf", "doc", "docx", "xls", "xlsx", "mp3", "mp4", "zip"], accept_multiple_files=False ) if uploaded_file: status, message = file_manager.upload_file(uploaded_file) if status == "success": st.success(message) else: st.error(message) # بخش جستجو و فیلتر col1, col2 = st.columns([2, 1]) with col1: search_term = st.text_input("🔍 جستجوی فایل", placeholder="نام فایل را وارد کنید...") with col2: file_type = st.selectbox( "📁 نوع فایل", ["همه", ".jpg", ".jpeg", ".png", ".gif", ".txt", ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".mp3", ".mp4", ".zip"] ) # نمایش لیست فایل‌ها files = file_manager.list_files(search_term, file_type) if not files: st.markdown("""
📭 هیچ فایلی یافت نشد
""", unsafe_allow_html=True) else: for file in files: file_info = file_manager.get_file_info(file) with st.container(): st.markdown(f"""

{file_info['icon']} {file}

اندازه: {file_info['size']} | نوع: {file_info['type']} | آخرین تغییر: {file_info['modified']}

""", unsafe_allow_html=True) col1, col2, col3, col4 = st.columns([1, 1, 1, 1]) with col1: if st.button("👁️ نمایش", key=f"preview_{file}"): preview_type, preview_content = file_manager.preview_file(file) if preview_type == "image": st.image(preview_content, use_column_width=True) elif preview_type == "text": st.text(preview_content) else: st.warning(preview_content) with col2: if st.button("🗑️ حذف", key=f"delete_{file}"): if st.session_state.get('admin_logged_in', False): status, message = file_manager.delete_file(file) st.success(message) if status == "success" else st.error(message) else: st.error("⛔ فقط مدیر می‌تواند فایل‌ها را حذف کند") with col3: with open(file_manager.root_path / file, 'rb') as f: st.download_button( "⬇️ دانلود", f.read(), file_name=file, key=f"download_{file}" ) # بخش فشرده‌سازی st.markdown("""

🗜️ فشرده‌سازی فایل‌ها

""", unsafe_allow_html=True) selected_files = st.multiselect( "فایل‌های مورد نظر را انتخاب کنید", files, key="compress_files" ) if st.button("📦 ساخت فایل ZIP"): if selected_files: status, message = file_manager.compress_files(selected_files) if status == "success": st.success(message) else: st.error(message) else: st.warning("⚠️ لطفاً حداقل یک فایل انتخاب کنید") st.markdown('
', unsafe_allow_html=True) if __name__ == "__main__": main()