Skip to main content

Module asset_upload

Module asset_upload 

Source
Expand description

素材上传 modal(素材管理页内上传)。 素材上传 modal(素材管理页内上传)。

三条入口(点击选择 / 拖拽 / 粘贴)收敛到同一个 enqueue_files:拿到的 web_sys::File 先过 validate_file(镜像服务端 5MiB / 四种 MIME 的硬限制, 不合格立即记失败行、不发请求),合格项入共享队列后由 worker 池并发上传: 在跑 worker 数上限 = 并发配置(「站点配置」面板 / UPLOAD_CONCURRENCY env 播种, 挂载时经 get_upload_settings 拉取,失败回退默认 3)。每个 worker 张间停顿 500ms × 当前并发数——N 路并行时聚合速率恒 ≤ 2/s,与默认上传限流桶 (RATE_LIMIT_UPLOAD_PER_SEC=2 / BURST=15)对齐:N=1 时与旧顺序版逐张 500ms 完全一致,N 调大也不触发 429。上传管线与文章编辑器完全同源 (upload_image_filePOST /api/upload)。

Esc / 粘贴监听挂在 window 上,只在 mount 注册一次、use_drop 移除;handler 内用 visible.peek() 守卫——modal 关闭后粘贴绝不触发上传。无文件的文本粘贴不拦截 (不 prevent_default),搜索框等正常粘贴不受影响。原生监听器触发时 Dioxus 的 scope 栈为空(spawn 会因 current_scope_id unwrap 空栈而 panic),渲染期捕获的 组件 scope id 在粘贴 handler 里经 Runtime::in_scope 显式进栈后再入队,使粘贴路径 与 Dioxus 事件入口(拖拽/选择)的 spawn 语义完全一致。

组件始终挂载(visible 只控制渲染早退),上传中途允许关闭弹窗:spawn 的 worker 与 signals 随组件实例存活,后台续传,每批(一次拖拽/选择/粘贴)收尾时 ≥1 个成功仍照常 回调 on_uploaded

注:worker 池共享状态用 Rc<UploadPool> 而非裸 Cell/RefCell——use_hook 每次渲染 都会 clone 存储值(dioxus-core use_hook_inner.cloned()),裸结构会被按值 拷贝,各入口闭包拿到互不同步的副本导致 id 冲突与队列分裂;Rc 克隆共享同一实例。

Re-exports§

pub use AssetUploadModal_completions::Component::AssetUploadModal;

Structs§

AssetUploadModalProps
Properties for the AssetUploadModal component.
UploadItem 🔒
列表行数据(纯数据,两端都可编译;web_sys::File 句柄不进 signal, 由 WASM 端的 files 表以 id 关联保存,供重试取回)。

Enums§

UploadStatus 🔒
单条上传状态机:Queued → Uploading → Done / Failed(原因)。

Constants§

EXIT_ANIM_MS 🔒
关闭/移除动画时长 ms,与 input.css 的 200ms 过渡/动画时长一一对应。

Functions§

AssetUploadModal
素材上传 modal。