Простой и удобный сервер для загрузки файлов в локальной сети с автоматическим отслеживанием истории пользователей.
- Быстрая загрузка файлов через веб-интерфейс
- Автоматическая идентификация пользователей через cookies
- История загрузок для каждого пользователя
- Адаптивный дизайн — работает на телефонах и компьютерах
- Сквозная нумерация всех загрузок
- Автоматическая организация файлов в папки
- Автоочистка старых записей (по умолчанию 1 день)
- Backend: FastAPI, Python 3.14+
- Frontend: Vanilla JavaScript, CSS
- Package Manager: uv
- Python 3.14+
- uv (установка:
curl -LsSf https://astral.sh/uv/install.sh | sh)
git clone https://github.com/yourdisenchantment/upload-server.git
cd upload-serveruv syncuv run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reloadhttp://localhost:8000
Или с другого устройства в локальной сети:
http://<IP-адрес-сервера>:8000
Узнать IP адрес:
- Linux/Mac:
ip addr show | grep "inet " - Windows:
ipconfig
upload-server/
├── app/
│ ├── api/routes/ # API эндпоинты
│ │ ├── pages.py # Главная страница
│ │ ├── upload.py # Загрузка файлов
│ │ └── history.py # История загрузок
│ ├── core/ # Конфигурация
│ │ ├── config.py # Настройки приложения
│ │ └── dependencies.py # FastAPI dependencies
│ ├── schemas/ # Pydantic модели
│ │ └── models.py # Схемы данных
│ ├── services/ # Бизнес-логика
│ │ ├── user_service.py # Генерация user_id
│ │ ├── upload_service.py # Загрузка файлов
│ │ └── history_service.py # Работа с историей
│ ├── static/ # Статические файлы
│ │ ├── index.html # Веб-интерфейс
│ │ ├── scripts/app.js # JavaScript
│ │ ├── styles/app.css # Стили
│ │ └── images/ # Иконки
│ └── main.py # Точка входа
├── data/ # Данные (создается автоматически)
│ ├── history.csv # История загрузок
│ └── upload/ # Загруженные файлы
├── pyproject.toml # Конфигурация проекта
└── README.md
USER_ID_LENGTH = 6 # Длина ID пользователя
COOKIE_NAME = "user_id" # Имя cookie
COOKIE_AGE = 100 * 365 * 24 * 60 * 60 # Срок жизни cookie (100 лет)В app/main.py измените параметр days:
history_service.cleanup_old_records(days=1) # 1 день (по умолчанию)data/upload/
├── 00001_26-01-2025_abc123/
│ ├── photo1.jpg
│ └── document.pdf
├── 00002_26-01-2025_xyz789/
│ └── file.txt
└── 00003_27-01-2025_abc123/
└── video.mp4
Формат: {номер}_{дата}_{user_id}
date,user_id,files_count,total_size,folder_name
26-01-2025,abc123,2,1234567,00001_26-01-2025_abc123
26-01-2025,xyz789,1,234567,00002_26-01-2025_xyz789Главная страница с веб-интерфейсом
Загрузка файлов
Request:
files: массив файлов (multipart/form-data)- Cookie:
user_id(опционально)
Response:
{
"success": true,
"user_id": "abc123",
"upload_number": 5,
"folder_name": "00005_26-01-2025_abc123",
"files_count": 3,
"total_size": 1234567,
"message": "Successfully uploaded 3 files"
}Получить историю загрузок пользователя
Response:
[
{
"upload_number": 5,
"date": "26-01-2025",
"user_id": "abc123",
"files_count": 3,
"total_size": 1234567,
"folder_name": "00005_26-01-2025_abc123"
}
]Важно: Этот сервер предназначен для использования в доверенной локальной сети.
- Нет аутентификации
- Нет ограничений по размеру файлов
- Нет проверки типов файлов
- Cookie не защищены (httponly=false для доступа из JS)
Не используйте в публичном интернете без дополнительной защиты!
Жесткое обновление:
- Chrome/Edge:
Ctrl + Shift + R - Firefox:
Ctrl + F5 - Safari:
Cmd + Option + R
- Проверьте наличие cookie
user_idв DevTools (F12 -> Application -> Cookies) - Очистите cookies и загрузите файлы заново
- Проверьте Console (F12) на наличие ошибок
uv sync --group devuv run ruff format .uv run ruff check .