PyTorch:torch.nonzero——从稀疏数据到精准索引的实战指南
2026/5/17 2:13:22
graph LR A[客户端] --> B[网关层(Nginx+Lua)] B --> C[应用层(JSP/SpringBoot)] C --> D[存储层(阿里云OSS/本地存储)] C --> E[数据库(MySQL/达梦)] C --> F[缓存层(Redis)]// FileChunkController.java (SpringBoot)@RestControllerpublicclassFileChunkController{@Value("${storage.type}")privateStringstorageType;@PostMapping("/upload/chunk")publicResponseEntityhandleChunk(@RequestParam("file")MultipartFilefile,@RequestParam("md5")Stringmd5,@RequestParam("chunkIndex")intchunkIndex){// 1. 保存分片到临时目录PathtempPath=Paths.get("/temp/uploads",md5,chunkIndex+"");Files.createDirectories(tempPath.getParent());Files.write(tempPath,file.getBytes(),StandardOpenOption.CREATE);// 2. 更新进度到RedisredisTemplate.opsForSet().add("upload_progress:"+md5,chunkIndex+"");// 3. 检查是否完成if(isAllChunksUploaded(md5)){// 合并分片mergeChunks(md5);// 加密存储encryptFile(md5,getEncryptionAlgorithm());}returnResponseEntity.ok().build();}privateStringgetEncryptionAlgorithm(){returnconfigService.getEncryptionType();// 动态配置}}// crypto-adapter.js (框架无关加密层)exportclassCryptoAdapter{constructor(algorithm='SM4'){this.algorithm=algorithm;}encrypt(file){returnnewPromise((resolve)=>{if(this.algorithm==='SM4'){// 国密加密constsm4=newSM4();resolve(sm4.encrypt(file));}else{// AES加密constaes=newAES();resolve(aes.encrypt(file));}});}}// upload-manager.js (Vue2/React通用)classUploadManager{constructor(){this.progressCache=newMap();}asyncresumeUpload(file,md5){constprogress=awaitthis.getProgress(md5);constchunks=this.createChunks(file);for(leti=0;i<chunks.length;i++){if(!progress.has(i)){awaitthis.uploadChunk(chunks[i],md5,i);}}// 触发合并请求awaitfetch('/upload/merge',{method:'POST',body:JSON.stringify({md5,totalChunks:chunks.length})});}getProgress(md5){// 优先从本地缓存获取if(this.progressCache.has(md5)){returnPromise.resolve(this.progressCache.get(md5));}// 否则从服务端获取returnfetch('/upload/progress/'+md5).then(res=>res.json());}}// framework-adapter.jsexportclassFrameworkAdapter{staticgetUploadComponent(){if(window.Vue){returnrequire('./vue-adapter').default;}elseif(window.React){returnrequire('./react-adapter').default;}thrownewError('Unsupported framework');}}storage:type:${STORAGE_TYPE:oss}# 支持oss/local/s3oss:access-key:${OSS_ACCESS_KEY}secret-key:${OSS_SECRET_KEY}endpoint:${OSS_ENDPOINT}local:base-path:/data/files// DatabaseConfig.java@ConfigurationpublicclassDatabaseConfig{@Bean@ConfigurationProperties(prefix="spring.datasource")publicDataSourcedataSource(){StringdbType=env.getProperty("spring.datasource.type","mysql");switch(dbType){case"oracle":returnnewOracleDataSource();case"sqlserver":returnnewSQLServerDataSource();default:returnnewHikariDataSource();}}}| 项目 | 金额(万元) | 说明 |
|---|---|---|
| 源码授权 | 68 | 永久使用+商业许可 |
| 定制开发 | 20 | 兼容IE8/信创环境适配 |
| 技术培训 | 10 | 3次现场培训(每次2天) |
| 合计 | 98 |
本方案已通过集团技术委员会评审,现进入商务选型阶段,欢迎符合要求的厂商提交正式方案及报价。
导入到Eclipse:点南查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程
NOSQL示例不需要任何配置,可以直接访问测试
选择对应的数据表脚本,这里以SQL为例
up6/upload/年/月/日/guid/filename
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
点击下载完整示例