Assistant / admin_dashboard_filemanager.py
Really-amin's picture
Upload 5 files
5296912 verified
raw
history blame
5.24 kB
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))