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).