门限秘密共享实现联邦学习安全聚合:FedSTSS原理、复现与对比
2026/10/4 6:57:39
昨天接了个"看似简单实则要命"的外包项目,客户甩来的需求清单让我差点把咖啡喷到屏幕上:
export default { data() { return { progress: 0, chunks: [], isPaused: false } }, methods: { handleFile(e) { const file = e.target.files[0] this.splitFile(file) }, splitFile(file) { const chunkSize = 5 * 1024 * 1024 // 5MB分片 const totalChunks = Math.ceil(file.size / chunkSize) for(let i=0; i<totalChunks; i++) { this.chunks.push({ index: i, loaded: 0, blob: file.slice(i*chunkSize, (i+1)*chunkSize) }) } this.uploadChunks() }, async uploadChunks() { for(let chunk of this.chunks) { if(this.isPaused) break const formData = new FormData() formData.append('chunk', chunk.blob) formData.append('index', chunk.index) formData.append('total', this.chunks.length) formData.append('md5', await this.calculateMD5(chunk.blob)) await axios.post('/upload', formData, { onUploadProgress: (e) => { chunk.loaded = e.loaded this.progress = (this.chunks.reduce((sum,c)=>sum+c.loaded,0)/file.size)*100 } }) } if(!this.isPaused) this.mergeChunks() }, pauseUpload() { this.isPaused = !this.isPaused alert(this.isPaused ? '已暂停(老板您终于点对了!)' : '继续上传(求您别点了!)') } } }query("INSERT INTO progress (md5, index, total) VALUES ('$md5',$index,$total)");// 合并分片(终极生死时刻)if($index==$total-1){$file=fopen("uploads/$md5",'w');for($i=0;$i<$total;$i++){fwrite($file,file_get_contents("temp/$md5-$i"));}fclose($file);// 通知前端完成(客户:能发个邮件吗?我们不看控制台)echojson_encode(['status'=>'success','url'=>"uploads/$md5"]);}欢迎各位同行加入QQ群374992201,在这里你可以:
最后温馨提示:接外包需谨慎,遇到说"简单改改就行"的客户,请立即准备好降压药和速效救心丸!💊
PHP:7.2.14
NOSQL不需要任何配置,可以直接访问测试
您可以直接复制脚本进行创建
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
支持文件批量下载
文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。
支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。
点击下载完整示例