分块上传
浏览器切片,服务端逐块追加,不把整个文件读进内存。
AetherUpload 在浏览器里把文件切片,逐块追加到服务端临时文件,落盘时用文件内容的 md5 命名,上传、续传、秒传、去重与完整性校验因此共用同一套机制。
内核只经 Runtime 门面调用宿主能力,配置、路由、命令、语言文件与前端脚本按宿主分发,同一份代码在九个宿主下运行。
一只云团状的以太兽:头顶向上的上传箭头,腹部一条进度条代表分块上传进度,右侧一块带虚线拖尾的分块正在飞来。
把大文件切小块,一块一块送上去。从浏览器切片到服务端落盘,每个环节都有对应的机制。
浏览器切片,服务端逐块追加,不把整个文件读进内存。
弱网下自动重试,已写入的块不重复传,缺哪块补哪块。
相同 md5 直接命中已有成品,一个分块都不用传。
最后一块复核大小与 MIME,并重算整份 md5 后落盘。
内置零依赖 S3 客户端,可切换本地磁盘与对象存储。
同一套内核运行在 webman、原生 PHP 与七个框架中。
PHP 版本之外,也可以直接使用 Rust 实现。
同一套上传语义的 Rust 实现
把分块、续传、秒传、去重与完整性校验带到 Rust,接入八个框架,默认 feature 零第三方依赖。
四次发布,把上传内核与宿主框架彻底解耦。
修复 webman 卸载包时 Install::uninstall() 漏掉适配器兜底绑定的问题。
新增原生 PHP 适配器,端到端真跑 php -S 与 curl,零框架也能用。
内核与宿主解耦,七个宿主适配器与 12 种语言文档同批落地。
修复秒传、控制台命令与输入边界问题,新增 42 项回归测试。
点击图片放大查看。
先安装,再跑一个最小示例。
composer require erikwang2013/aetherupload-webmanrequire __DIR__ . '/../vendor/autoload.php';
exit(\AetherUpload\Adapter\Native\Bootstrap::handle([
'base_path' => dirname(__DIR__),
'config' => require __DIR__ . '/../config/aetherupload.php',
]));cargo add aetherupload-rust --features axumuse std::sync::Arc;
use aetherupload::{Config, Runtime};
let runtime = Arc::new(Runtime::new(Config::default(), ".")?);
let app = aetherupload::integrations::axum::routes(runtime);鼠标停一停,它会换一种心情。