Spaces:
Sleeping
Sleeping
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 = """ | |
<style> | |
body { | |
font-family: 'Vazir', sans-serif; | |
background: linear-gradient(135deg, #ece9e6, #ffffff); | |
} | |
.dashboard-container { | |
max-width: 800px; | |
margin: auto; | |
padding: 20px; | |
} | |
.glass-card, .glass-button, .drag-drop { | |
backdrop-filter: blur(10px); | |
background: rgba(255, 255, 255, 0.15); | |
border-radius: 20px; | |
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.15), -4px -4px 10px rgba(255, 255, 255, 0.7); | |
padding: 20px; | |
margin: 15px 0; | |
transition: all 0.3s ease; | |
} | |
.glass-button { | |
color: #ffffff; | |
background: linear-gradient(135deg, #4a90e2, #50e3c2); | |
border: none; | |
font-size: 18px; | |
cursor: pointer; | |
width: 100%; | |
padding: 10px 20px; | |
margin-top: 10px; | |
border-radius: 20px; | |
transition: all 0.3s ease; | |
} | |
.glass-button:hover { | |
background: linear-gradient(135deg, #50e3c2, #4a90e2); | |
} | |
.drag-drop { | |
border: 2px dashed #4a90e2; | |
padding: 40px; | |
text-align: center; | |
cursor: pointer; | |
} | |
</style> | |
""" | |
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)) | |