Deploy drhider / validate (push) Canceled after 0s
- Update upload/ module to v0.2.2 with modular Layer 1 (FilePicker) and Layer 2 (Streaming transit upload) - Replace legacy manual file table in site/templates/index.html with FilePicker.initFilePicker - Wire uploadViaVM with per-file status updates and abort signal support - Add dist bundles to dist/ and site/static/dist/ with routes in site/routes/main_bp.py - Add test_hardening.py and test_safe_name.py from upload-platform - Bump version to 0.0.78 in site/app.py - Document integration plan and report in History/upload-integration/
2.3 KiB
2.3 KiB
Upload module (v0.2.0)
Переиспользуемый модуль загрузки, состоящий из двух независимых слоёв:
-
Слой 1 (
upload/frontend/) — File Picker:- IIFE:
FilePicker.initFilePicker(config); - ESM:
import { initFilePicker } from './file-picker.esm.js'(или изupload/frontend/index.js). - Получение выбранных файлов:
picker.getFiles()возвращает плоский массив{ path, name, size, file }. - Поддерживает выбор файлов, папок, клиентскую распаковку ZIP (fflate) и проверку лимитов.
- IIFE:
-
Слой 2 (
upload/frontend/upload/+upload/backend/) — Пофайловый транзит в RAM сессии:- Фронтенд:
uploadViaVM(files, options)илиFilePicker.uploadViaVM(files, options):- Пофайловый стриминг: для каждого файла выполняется
PUTв буфер на ВМ, немедленныйPOST /api/upload_refsв бэкенд, и после подтверждения приёма буфер на ВМ очищается. - Поддержка
AbortSignalдля отмены загрузки на любом этапе.
- Пофайловый стриминг: для каждого файла выполняется
- Бэкенд:
create_upload_refs_blueprint(cfg):- Приём ссылок через исходящий потоковый
GETв память RAM. - SSRF-валидация префикса буфера (
vmUploadPrefix). - Защита от path traversal (
safe_name). - Хранилище сессий в оперативной памяти (
upload/backend/session). - Никакой записи на диск.
- Приём ссылок через исходящий потоковый
- Фронтенд:
Интеграция в сторонний проект
- Скопировать каталог
upload/в проект. - Во Flask подключить Blueprint:
from upload.backend.upload_refs import create_upload_refs_blueprint app.register_blueprint(create_upload_refs_blueprint({"vmUploadPrefix": "..."})) - На фронтенде подключить
file-picker.iife.jsили импортировать ESM. - Вызвать
initFilePicker, а при отправке вызватьuploadViaVM(picker.getFiles(), options).