📤 آپلود فایل
فایل خود را اینجا رها کنید یا کلیک کنید
{file_info['icon']} {file}
اندازه: {file_info['size']} | نوع: {file_info['type']} | آخرین تغییر: {file_info['modified']}
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('
فایل خود را اینجا رها کنید یا کلیک کنید
اندازه: {file_info['size']} | نوع: {file_info['type']} | آخرین تغییر: {file_info['modified']}