import streamlit as st from pathlib import Path from datetime import datetime import shutil import zipfile from PIL import Image import time # تنظیمات صفحه st.set_page_config(page_title="مدیریت فایل‌ها", layout="centered", page_icon="📁") # CSS برای طراحی گلس مورفیسم و نئومورفیسم 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 upload_file(self, file): """آپلود فایل با نوار پیشرفت""" dest_path = self.root_path / file.name with open(dest_path, "wb") as f: total_size = file.size chunk_size = 1024 bytes_read = 0 while bytes_read < total_size: data = file.read(chunk_size) f.write(data) bytes_read += len(data) st.progress(bytes_read / total_size) return f"فایل '{file.name}' با موفقیت آپلود شد." def list_files(self, file_type=None): """لیست فایل‌ها با فیلتر نوع فایل""" files = [f.name for f in self.root_path.iterdir() if f.is_file() and (not file_type or f.suffix == file_type)] return files def delete_file(self, filename): """حذف فایل""" path = self.root_path / filename if path.exists(): path.unlink() return f"فایل '{filename}' حذف شد." return f"فایل '{filename}' یافت نشد." def preview_file(self, filename): """پیش‌نمایش فایل""" path = self.root_path / filename if path.suffix in ['.jpg', '.jpeg', '.png']: return Image.open(path) elif path.suffix == '.txt': with open(path, "r", encoding="utf-8") as f: return f.read(300) return "پیش‌نمایش در دسترس نیست." def compress_files(self, files): """فشرده‌سازی فایل‌ها""" zip_name = f"compressed_{datetime.now().strftime('%Y%m%d%H%M%S')}.zip" zip_path = self.root_path / zip_name with zipfile.ZipFile(zip_path, 'w') as zipf: for file in files: file_path = self.root_path / file zipf.write(file_path, file) st.progress((files.index(file) + 1) / len(files)) return f"فایل‌ها با نام '{zip_name}' فشرده شدند." file_manager = FileManager() # آپلود فایل st.title("📁 مدیریت فایل‌ها") uploaded_file = st.file_uploader("فایل خود را آپلود کنید", type=["jpg", "jpeg", "png", "txt"], accept_multiple_files=False) if uploaded_file: st.write(file_manager.upload_file(uploaded_file)) # لیست فایل‌ها و فیلتر نوع فایل st.subheader("فایل‌های آپلود شده") file_type = st.selectbox("نمایش فایل‌های:", ["همه", ".jpg", ".txt", ".png"], index=0) files = file_manager.list_files(None if file_type == "همه" else file_type) # نمایش منوی زمینه و عملیات‌ها for file in files: col1, col2, col3, col4 = st.columns([3, 1, 1, 1]) with col1: if st.button(f"پیش‌نمایش {file}"): preview = file_manager.preview_file(file) if isinstance(preview, str): st.text(preview) else: st.image(preview) with col2: if st.button(f"حذف {file}"): st.write(file_manager.delete_file(file)) with col3: st.download_button(label=f"دانلود {file}", data=open(file_manager.root_path / file, 'rb').read(), file_name=file) # فشرده‌سازی فایل‌ها st.subheader("فشرده‌سازی فایل‌ها") selected_files = st.multiselect("فایل‌های موردنظر را انتخاب کنید", files) if st.button("فشرده‌سازی فایل‌ها"): st.write(file_manager.compress_files(selected_files))