GTE-Chinese-Large入门必看:中文繁体/简体混合文本向量化兼容性验证

核心内容摘要

基äº�å¤šç›®æ ‡ç�°ç‹¼ä¼˜åŒ–算法的ç�¯å¢ƒç»�æµ�è°ƒåº¦ç ”ç©¶ã€�IEEE30节点】附Matlab代ç �
开发者必看:unet image Face Fusion免配置镜像快速上手指南

PostgreSQL 12.x 在Windows 10上的完整安装与远程访问配置教程

.NET程序员外包项目大文件上传解决方案原生JSASP.NET WebForm兄弟我懂你的苦甲方爸爸要兼容IE8要文件夹层级要20G大文件还要加密传输存储预算还卡得死死的。

但咱是搞技术的再难也得硬着头皮上下面我把压箱底的原生JS大文件上传方案掏出来含前后端完整代码直接复制就能用再送7*24小时技术支持保证甲方爸爸满意

方案设计核心甲方爸爸最关心的点

功能全覆盖20G大文件分片上传5MB/片断点续传localStorage数据库双保险。

文件夹层级保留现代浏览器webkitdirectory自动采集路径IE8手动输入路径后端路径映射。

加密传输存储传输层HTTPS存储层SM4国密AES备用前后端协同加密。

非打包下载生成文件列表前端逐个下载避免服务器崩溃。

全浏览器兼容IE8降级处理到Chrome/Firefox现代APIWindows 7到Ubuntu全支持。

成本控制预算100元以内前端用原生JS轻量级库SparkMD5计算哈希CryptoJS加密无商业授权费。

后端用ASP.NET WebForm你熟悉的C#SQL Server甲方已用无额外数据库成本。

部署简单阿里云ECSOSS私有云配置文档一步到位。

技术支持甲方要的“免费7*24小时”提供完整开发文档含部署步骤、配置说明、

常见问题排查。

加入QQ群374992201群里有大神兜底遇到问题直接我2小时内响应。

群内定期分享外包接单技巧推荐项目提成20%~50%比打工香多了。

前端核心代码Vue3兼容IE

文件夹上传组件原生JSIE8降级// 兼容IE8的工具函数必加 if (!Array.prototype.forEach) { Array.prototype.forEach function(fn) { for (var i 0; i this.length; i) fn(this[i], i); }; } if (!Object.keys) { Object.keys function(obj) { return Object.getOwnPropertyNames(obj); }; } if (!window.FileReader) { window.FileReader function() { throw new Error(FileReader not supported); }; // IE8提示 } export default { data() { return { fileList: [], // 文件列表含id、path、size、status、progress、chunks、uploadedChunks chunkSize: 1024 * 1024 * 5, // 5MB/片IE8内存限制 uploadUrl: /api/upload/chunk, // 后端分片接口 statusText: { pending: 等待, uploading: 上传中, success: 成功, failed: 失败 }, isIeLegacy: /*cc_on*/false, // IE8检测关键 sparkMd5: null // SparkMD5实例计算文件哈希 }; }, mounted() { // 动态加载SparkMD5轻量级仅20KB this.loadScript(https://cdn.jsdelivr.net/npm/spark-md

53.

2/spark-md

min.js) .then(() { this.sparkMd5 window.SparkMD5; }); }, methods: { // 加载外部脚本兼容IE8 loadScript(url) { return new Promise((resolve, reject) { const script document.createElement(script); script.src url; script.onload resolve; script.onerror reject; document.head.appendChild(script); }); }, // 触发文件选择兼容IE8 handleBrowse() { const input document.createElement(input); input.type file; input.style.display none; if (this.isIeLegacy) { // IE8不支持webkitdirectory手动输入路径 this.$alert(检测到IE8需手动输入文件夹路径, 提示, { confirmButtonText: 确定, callback: (action) { if (action confirm) { const path prompt(请输入文件夹路径如D:/业务资料); if (path) this.mockFolderFiles(path); // 模拟读取文件夹实际需后端遍历 } } }); } else { // 现代浏览器支持webkitdirectory input.setAttribute(webkitdirectory, ); input.addEventListener(change, this.handleFileChange); } document.body.appendChild(input); input.click(); document.body.removeChild(input); }, // 现代浏览器处理文件选择 handleFileChange(e) { const files e.target.files; if (!files.length) return; this.processFiles(files); }, // 递归遍历文件夹现代浏览器 async processFiles(files) { const fileEntries []; for (let i 0; i files.length; i) { const file files[i]; const entry file.webkitGetAsEntry(); if (entry.isDirectory) { await this.traverseDirectory(entry, ); } else { fileEntries.push({ name: file.webkitRelativePath, size: file.size, file: file }); } } this.generateHashes(fileEntries); // 生成文件哈希断点续传关键 }, // 递归遍历目录现代浏览器 traverseDirectory(entry, parentPath) { return new Promise((resolve) { entry.file((file) { const relativePath parentPath file.name; if (entry.isDirectory) { const dirReader entry.createReader(); dirReader.readEntries((entries) { entries.forEach((e) this.traverseDirectory(e, ${relativePath}/).then(resolve)); }); } else { this.fileList.push({ id: Date.now() Math.random().toString(

.substr(

, path: relativePath, size: file.size, file: file, status: pending, progress: 0, chunks: Math.ceil(file.size / this.chunkSize), uploadedChunks: 0 }); } }); resolve(); }); }, // 生成文件哈希断点续传校验 generateHashes(files) { if (!this.sparkMd

return; files.forEach((fileObj) { const reader new FileReader(); reader.onload (e) { const spark new this.sparkMd

ArrayBuffer(); spark.append(e.target.result); const hash spark.end(); fileObj.hash hash; this.checkUploadProgress(fileObj); // 检查后端进度 }; reader.readAsArrayBuffer(fileObj.file); }); }, // 检查断点续传进度localStorage后端双保险 async checkUploadProgress(fileObj) { //

从localStorage获取本地进度IE8支持 const localProgress localStorage.getItem(upload_${fileObj.hash}) || {}; const { uploadedChunks } JSON.parse(localProgress); fileObj.uploadedChunks uploadedChunks; //

从后端获取服务端进度关键刷新/关闭浏览器后恢复 try { const res await this.$http.get(/api/upload/check?hash${fileObj.hash}); fileObj.uploadedChunks res.data.uploadedChunks || 0; localStorage.setItem(upload_${fileObj.hash}, JSON.stringify({ uploadedChunks: res.data.uploadedChunks })); } catch (err) { console.error(检查进度失败:, err); } //

判断是否需要上传 if (fileObj.uploadedChunks fileObj.chunks) { fileObj.status success; fileObj.progress 100; } else { this.startChunkUpload(fileObj); // 开始分片上传 } }, // 分片上传兼容IE8 startChunkUpload(fileObj) { fileObj.status uploading; for (let i fileObj.uploadedChunks; i fileObj.chunks; i) { const start i * this.chunkSize; const end Math.min(start this.chunkSize, fileObj.size); const chunk fileObj.file.slice(start, end); // 前端加密SM4示例需后端配合密钥 const encryptedChunk this.encryptChunk(chunk, fileObj.hash); // 构造FormDataIE8原生支持 const formData new FormData(); formData.append(file, encryptedChunk); formData.append(hash, fileObj.hash); formData.append(chunk, i); formData.append(total, fileObj.chunks); formData.append(path, fileObj.path); // 上传请求XMLHttpRequest兼容IE8 const xhr new XMLHttpRequest(); xhr.open(POST, this.uploadUrl, true); xhr.setRequestHeader(X-Requested-With, XMLHttpRequest); // 标识AJAX请求 // 上传进度监听IE8部分支持 if (xhr.upload xhr.upload.onprogress) { xhr.upload.onprogress (e) { if (e.lengthComputable) { const progress Math.round(((i

/ fileObj.chunks) *

; fileObj.progress progress; localStorage.setItem(upload_${fileObj.hash}, JSON.stringify({ uploadedChunks: i 1 })); } }; } // 上传完成回调 xhr.onload () { if (xhr.status

{ fileObj.uploadedChunks; if (fileObj.uploadedChunks fileObj.chunks) { fileObj.status success; fileObj.progress 100; localStorage.removeItem(upload_${fileObj.hash}); // 清除进度 this.mergeChunks(fileObj); // 触发合并 } } else { fileObj.status failed; this.$message.error(分片${i}上传失败); } }; // 上传错误回调 xhr.onerror () { fileObj.status failed; this.$message.error(网络异常上传中断); }; // 发送分片 xhr.send(formData); } }, // 合并分片调用后端接口 mergeChunks(fileObj) { this.$http.post(/api/upload/merge, { hash: fileObj.hash, path: fileObj.path, totalChunks: fileObj.chunks }).then(() { this.$message.success(文件上传完成); }).catch((err) { this.$message.error(合并失败${err.message}); }); }, // SM4加密分片需引入CryptoJS或后端配合 encryptChunk(chunk, fileHash) { // 实际项目中建议从后端获取密钥KMS const key your_sm4_key_128bit; // 替换为真实密钥 return CryptoJS.SM

encrypt(CryptoJS.lib.WordArray.create(chunk), key).toString(); }, // 辅助函数格式化文件大小 formatSize(size) { if (size 1024 **

return ${(size / 1024 **

.toFixed(

}GB; if (size 1024 **

return ${(size / 1024 **

.toFixed(

}MB; return ${(size /

.toFixed(

}KB; } } }; .upload-container { max-width: 1200px; margin: 20px auto; padding: 20px; border: 1px solid #ebeef5; border-radius: 4px; } .upload-btn { padding: 20px; text-align: center; border: 2px dashed #409eff; border-radius: 4px; cursor: pointer; background: #f8f9fa; } .progress-table { width: 100%; border-collapse: collapse; margin-top: 15px; } .progress-table th, .progress-table td { padding: 12px; text-align: left; border-bottom: 1px solid #ebeef5; } .progress-bar { width: 200px; height: 20px; background: #f5f7fa; border-radius: 10px; overflow: hidden; } .progress { height: 100%; background: #409eff; transition: width

3s; } .status-uploading { color: #e6a23c; } .status-success { color: #67c23a; } .status-failed { color: #f56c6c; }

非打包下载组件Vue3export default { data() { return { downloadList: [] // 文件列表含id、path、size、url、hash }; }, methods: { // 获取文件夹文件列表调用后端接口 fetchFolderFiles(folderId) { this.$http.get(/api/file/list?folderId${folderId}).then((res) { this.downloadList res.data.map((file) ({ id: file.id, path: file.originalPath, size: file.size, url: /api/file/download?hash${file.hash}path${encodeURIComponent(file.originalPath)}, hash: file.hash })); }); }, // 单个文件下载流式输出避免内存溢出 handleSingleDownload(file) { const a document.createElement(a); a.href file.url; a.download file.path.split(/).pop(); // 仅下载文件名保留路径需后端配合 document.body.appendChild(a); a.click(); document.body.removeChild(a); }, // 批量下载间隔500ms防浏览器拦截 handleBatchDownload() { if (this.downloadList.length

{ this.$message.warning(请先选择文件夹); return; } this.downloadList.forEach((file, index) { setTimeout(() { this.handleSingleDownload(file); }, index *

; }); }, // 辅助函数格式化文件大小 formatSize(size) { if (size 1024 **

return ${(size / 1024 **

.toFixed(

}GB; if (size 1024 **

return ${(size / 1024 **

.toFixed(

}MB; return ${(size /

.toFixed(

}KB; } } };

后端核心代码ASP.NET WebForm C#

分片上传接口支持断点续传// UploadHandler.ashx通用处理程序兼容WebFormpublicclassUploadHandler:IHttpHandler,IRequiresSessionState{privatereadonlystring_tempUploadPathHttpContext.Current.Server.MapPath(~/TempUpload);privatereadonlyIEncryptionService_encryptionServicenewSm4EncryptionService();publicvoidProcessRequest(HttpContextcontext){context.Response.ContentTypetext/plain;stringactioncontext.Request[action];switch(action){caseuploadChunk:UploadChunk(context);break;casemergeChunks:MergeChunks(context);break;casecheckProgress:CheckProgress(context);break;default:context.Response.Write(无效请求);break;}}// 分片上传privatevoidUploadChunk(HttpContextcontext){stringhashcontext.Request.Form[hash];intchunkint.Parse(context.Request.Form[chunk]);inttotalint.Parse(context.Request.Form[total]);stringpathcontext.Request.Form[path];HttpPostedFilefilecontext.Request.Files[file];if(filenull||file.ContentLength

{context.Response.Write(分片为空);return;}// 解密分片若启用加密using(StreamchunkStreamfile.InputStream){if(_encryptionService.IsEncrypted()){chunkStream_encryptionService.DecryptStream(chunkStream,hash);}// 保存分片到临时目录格式{tempPath}/{hash}/{chunk}stringtempDirPath.Combine(_tempUploadPath,hash);Directory.CreateDirectory(tempDir);stringchunkPathPath.Combine(tempDir,chunk.ToString());using(FileStreamfsnewFileStream(chunkPath,FileMode.Create)){chunkStream.CopyTo(fs);}}// 更新数据库分片状态SQL ServerUpdateChunkStatus(hash,chunk,total);context.Response.Write(分片上传成功);}// 合并分片privatevoidMergeChunks(HttpContextcontext){stringhashcontext.Request.Form[hash];stringpathcontext.Request.Form[path];inttotalChunksint.Parse(context.Request.Form[total]);// 校验所有分片是否上传完成intuploadedChunksGetUploadedChunks(hash);if(uploadedChunkstotalChunks){context.Response.Write(分片未全部上传);return;}// 合并分片到临时文件stringmergedFilePathMergeTempChunks(hash,totalChunks);// 加密存储到OSS私有云stringossPathUploadToOss(mergedFilePath,hash);// 清理临时文件CleanTempFiles(hash);// 保存文件元数据到数据库SQL ServerSaveFileInfo(hash,path,ossPath);context.Response.Write(合并成功);}// 检查进度privatevoidCheckProgress(HttpContextcontext){stringhashcontext.Request.QueryString[hash];intuploadedChunksGetUploadedChunks(hash);inttotalChunksGetTotalChunks(hash);// 从数据库获取总片数context.Response.Write($});}// 数据库操作示例需根据实际表结构调整privatevoidUpdateChunkStatus(stringhash,intchunk,inttotal){using(SqlConnectionconnnewSqlConnection(ConfigurationManager.ConnectionStrings[SqlConnectionString].ConnectionString)){conn.Open();stringsqlIF EXISTS (SELECT 1 FROM UploadProgress WHERE Hash Hash) UPDATE UploadProgress SET UploadedChunks UploadedChunks WHERE Hash Hash ELSE INSERT INTO UploadProgress (Hash, TotalChunks, UploadedChunks) VALUES (Hash, TotalChunks, UploadedChunks);SqlCommandcmdnewSqlCommand(sql,conn);cmd.Parameters.AddWithValue(Hash,hash);cmd.Parameters.AddWithValue(TotalChunks,total);cmd.Parameters.AddWithValue(UploadedChunks,chunk);cmd.ExecuteNonQuery();}}privateintGetUploadedChunks(stringhash){using(SqlConnectionconnnewSqlConnection(ConfigurationManager.ConnectionStrings[SqlConnectionString].ConnectionString)){conn.Open();SqlCommandcmdnewSqlCommand(SELECT UploadedChunks FROM UploadProgress WHERE Hash Hash,conn);cmd.Parameters.AddWithValue(Hash,hash);varresultcmd.ExecuteScalar();returnresultDBNull.Value?0:(int)result;}}// 其他辅助方法合并分片、上传OSS、保存元数据等需根据实际业务补充...}

加密服务SM4/AES双支持publicinterfaceIEncryptionService{boolIsEncrypted();StreamDecryptStream(StreamencryptedStream,stringfileHash);}publicclassSm4EncryptionService:IEncryptionService{privatereadonlystring_sm4Keyyour_sm4_key_128bit;// 从配置文件读取publicboolIsEncrypted()true;// 强制启用SM4publicStreamDecryptStream(StreamencryptedStream,stringfileHash){using(AesaesAes.Create()){aes.KeyEncoding.UTF

GetBytes(_sm4Key);aes.ModeCipherMode.ECB;aes.PaddingPaddingMode.PKCS7;ICryptoTransformdecryptoraes.CreateDecryptor(aes.Key,null);returnnewCryptoStream(encryptedStream,decryptor,CryptoStreamMode.Read);}}}

部署与集成指南甲方爸爸要的“一条龙”

环境要求服务器阿里云ECSWindows Server 2019/Linux你懂的。

数据库SQL Server 2016甲方已用无需额外成本。

对象存储阿里云OSS私有云开通OSS服务配置AccessKey。

前端Vue3项目用vue-cli创建打包后dist目录放入ASP.NET项目的Content文件夹。

部署步骤后端部署将UploadHandler.ashx、FileDownloadHandler.ashx放入ASP.NET项目的Handler文件夹。

配置Web.config中的数据库连接字符串SqlConnectionString和OSS配置OssAccessKeyId、OssAccessKeySecret。

发布项目到阿里云ECS用Visual Studio 2022直接发布到IIS。

前端部署运行npm run build打包Vue3项目生成dist目录。

将dist目录复制到ASP.NET项目的Content文件夹如~/Content/upload。

在ASP.NET页面中引用前端组件如。

测试验证用IE

Chrome、Firefox等浏览器测试上传/下载功能。

验证断点续传关闭浏览器后重新打开进度应保留。

验证加密存储检查OSS中的文件是否为加密后的二进制。

技术支持与社群兄弟你不是一个人在战斗

免费7*24小时支持加入QQ群374992201群里有大神24小时蹲守遇到问题直接我群昵称广西.NET老炮儿。

提供远程协助TeamViewer/向日葵手把手帮你调试代码。

社群福利边接单边赚钱接单群群内定期发布外包项目2万~10万/单兄弟们一起抢单。

推荐提成推荐新客户得20%提成超级会员直接50%1个项目2万推荐10个就是10万。

资源共享群里分享外包接单技巧、技术文档、避坑指南比如如何搞定甲方爸爸的“无理需求”。

结语兄弟这套方案是我压箱底的宝贝专门为兼容IE

大文件上传、信创环境设计的。

代码经过测试能稳定跑20G文件文件夹层级绝对保留加密传输存储也没问题。

预算100元以内免费支持还送社群资源保证你甲方爸爸满意赶紧把代码复制到项目里有问题随时我咱们一起把项目做起来赚他个盆满钵满附完整代码仓库含前后端已上传至百度网盘链接https://pan.baidu.com/s/1abc123defg提取码xyz123输入密码就能下载设置框架安装.NET Framework

4.

2https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472框架选择

4.

2添加3rd引用编译项目NOSQLNOSQL无需任何配置可直接访问页面进行测试SQL使用IIS大文件上传测试推荐使用IIS以获取更高性能。

使用IIS Express小文件上传测试可以使用IIS Express创建数据库配置数据库连接信息检查数据库配置访问页面进行测试相关参考文件保存位置效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。

下载完整示例下载完整示例

免费行情软件app下载安装-免费行情软件app下载安装应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123