自动化测试概念篇
2026/6/16 17:42:44
gmssl.js)Crypto API或crypto-js)File.slice())es5-shim和json2.jspolyfillPromise为jQuery.DeferredLIMITvsROW_NUMBER())// src/components/FileUploader.vueimportWebUploaderfrom'webuploader';importCryptoJSfrom'crypto-js';// 或引入SM4库exportdefault{data(){return{fileList:[],uploader:null,chunkSize:5*1024*1024,// 5MB分片};},methods:{handleFolderSelect(e){constfiles=e.target.files;constfileTree=this.parseFolder(files);// 递归解析文件夹结构this.fileList=fileTree;this.initUploader(fileTree);},parseFolder(files){consttree=[];for(leti=0;i<files.length;i++){constfile=files[i];constpathParts=file.webkitRelativePath.split('/');constfileName=pathParts.pop();constdirPath=pathParts.join('/')||'/';tree.push({id:file.lastModified+'-'+file.name,path:file.webkitRelativePath,name:fileName,size:file.size,type:file.type,dir:dirPath,});}returntree;},initUploader(fileList){this.uploader=WebUploader.create({swf:'/static/Uploader.swf',// IE8兼容server:'/api/upload',chunked:true,chunkSize:this.chunkSize,threads:3,formData:{encryptType:'AES',// 或 'SM4'},});fileList.forEach((file)=>{constreader=newFileReader();reader.onload=(e)=>{// 加密文件内容(示例:AES)constencrypted=CryptoJS.AES.encrypt(e.target.result,'your-secret-key').toString();// 模拟分片上传(实际需调用uploader.upload方法)this.uploadChunk(file,encrypted,0);};reader.readAsArrayBuffer(file);// 或使用slice分片读取});},uploadChunk(file,encryptedData,chunkIndex){// 实际需通过WebUploader的API实现分片上传console.log(`Uploading chunk${chunkIndex}of${file.path}`);},},};fetch为jQuery.ajax或axios(需配置xhr兼容模式)。// Controllers/UploadController.cs[ApiController][Route("api/[controller]")]publicclassUploadController:ControllerBase{privatereadonlyIWebHostEnvironment_env;privatereadonlyIDatabaseService_db;// 抽象数据库操作publicUploadController(IWebHostEnvironmentenv,IDatabaseServicedb){_env=env;_db=db;}[HttpPost]publicasyncTaskUpload(){varform=awaitRequest.ReadFormAsync();varfile=form.Files[0];varchunkIndex=int.Parse(form["chunkIndex"]);vartotalChunks=int.Parse(form["totalChunks"]);varfileId=form["fileId"];varencryptType=form["encryptType"];// "AES"或"SM4"// 临时存储分片vartempPath=Path.Combine(_env.WebRootPath,"temp",fileId.ToString());Directory.CreateDirectory(tempPath);varchunkPath=Path.Combine(tempPath,$"{chunkIndex}.dat");using(varstream=newFileStream(chunkPath,FileMode.Create)){awaitfile.CopyToAsync(stream);}// 如果是最后一个分片,则合并文件if(chunkIndex==totalChunks-1){varfinalPath=Path.Combine(_env.WebRootPath,"uploads",file.FileName);MergeChunks(tempPath,finalPath,totalChunks);// 解密文件(根据encryptType调用不同算法)if(encryptType=="AES"){DecryptFileAES(finalPath,"your-secret-key");}elseif(encryptType=="SM4"){// 调用SM4解密库}// 记录文件元数据到数据库await_db.SaveFileRecord(newFileRecord{Name=file.FileName,Path=finalPath,Size=file.Length,UploadTime=DateTime.Now,});Directory.Delete(tempPath,true);returnOk(new{success=true,path=finalPath});}returnOk(new{success=true,message="Chunk uploaded"});}privatevoidMergeChunks(stringtempDir,stringoutputPath,inttotalChunks){using(varoutputStream=newFileStream(outputPath,FileMode.Create)){for(inti=0;i<totalChunks;i++){varchunkPath=Path.Combine(tempDir,$"{i}.dat");varchunkData=System.IO.File.ReadAllBytes(chunkPath);outputStream.Write(chunkData,0,chunkData.Length);System.IO.File.Delete(chunkPath);}}}privatevoidDecryptFileAES(stringinputPath,stringkey){// 实现AES解密逻辑(需处理大文件流式解密)}}IDatabaseService抽象层隔离数据库差异:publicinterfaceIDatabaseService{TaskSaveFileRecord(FileRecordrecord);Task>GetFilesByUser(stringuserId);}// 达梦数据库实现publicclassDamengDatabaseService:IDatabaseService{privatereadonlystring_connString;publicDamengDatabaseService(IConfigurationconfig){_connString=config["ConnectionStrings:Dameng"];}publicasyncTaskSaveFileRecord(FileRecordrecord){using(varconn=newDmConnection(_connString)){awaitconn.OpenAsync();varcmd=newDmCommand("INSERT INTO FILES(NAME, PATH, SIZE, UPLOAD_TIME) VALUES(@name, @path, @size, @time)",conn);cmd.Parameters.AddWithValue("@name",record.Name);cmd.Parameters.AddWithValue("@path",record.Path);cmd.Parameters.AddWithValue("@size",record.Size);cmd.Parameters.AddWithValue("@time",record.UploadTime);awaitcmd.ExecuteNonQueryAsync();}}}# 安装.NET Core运行时sudoapt-getinstalldotnet-sdk-5.0# 运行项目dotnet run --project YourProject.csprojlibgdiplus(用于图像处理)。webkitdirectory支持情况(可能需降级为Flash上传组件)。Plupload)。(完)
P.S.:本项目已实现核心功能,但需进一步测试信创环境兼容性。欢迎大神贡献代码或提供优化建议!
安装.NET Framework 4.7.2
https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472
框架选择4.7.2
NOSQL无需任何配置可直接访问页面进行测试
使用IIS
大文件上传测试推荐使用IIS以获取更高性能。
小文件上传测试可以使用IIS Express
相关参考:
文件保存位置,
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
下载完整示例