2026/2/8 14:00:38
网站建设
项目流程
做跨境电商在什么网站选品,磁力蜘蛛搜索引擎,如何做公司的网站建设,神马移动排名优化.NET程序员外包项目解决方案#xff1a;原生JS大文件传输系统#xff08;兼容IE8#xff09;
兄弟#xff0c;作为陕西的个人.NET程序员#xff0c;我太懂你现在的处境了——甲方爸爸要大文件上传#xff0c;还要兼容IE8#xff0c;预算还卡得死死的。但咱是专业的原生JS大文件传输系统兼容IE8兄弟作为陕西的个人.NET程序员我太懂你现在的处境了——甲方爸爸要大文件上传还要兼容IE8预算还卡得死死的。但咱是专业的必须把活干漂亮今天就把压箱底的原生JS大文件传输方案掏出来含前后端完整代码、兼容性处理、加密方案保证能让甲方点头你也能按时交差一、方案核心专治甲方“奇葩需求”1. 功能全覆盖甲方要的都给20G大文件传输分片上传5MB/片断点续传localStorage存进度关浏览器/重启电脑不丢。文件夹层级保留递归遍历文件系统后端按路径存储IE8不支持webkitDirectory咱用“伪文件夹”方案兜底。加密传输存储前端AES加密分片后端SM4加密存储密钥动态生成甲方要国密咱就给。非打包下载流式传输逐个文件10万子文件也不怕服务器崩后端按需生成下载链接。全浏览器兼容IE8用Flash补全文件夹选择甲方要兼容就得硬刚Chrome/Firefox用原生API。2. 成本可控100元预算搞定原生JS实现0商业授权费用开源库CryptoJS/AES.js代码直接嵌入项目。轻量级后端ASP.NET WebForm原生开发不用额外买中间件。阿里云OSS免费额度前50G流量免费够甲方测试用后期不够再补预算外的钱咱不赚。3. 技术支持甲方要7×24小时给提供完整开发文档含IE8兼容配置、数据库脚本、OSS部署步骤。免费远程调试用TeamViewer帮你连服务器解决“上传到一半卡住”的玄学问题。群里200同行互助QQ群374992201遇到坑直接甩链接问大佬。二、前端核心代码原生JS兼容IE81. 文件夹上传伪文件夹方案兼容IE8大文件传输系统 开始上传 // 兼容IE8的文件夹选择用Flash兜底甲方要兼容就得用 if (!document.querySelector(input[webkitdirectory])) { document.write(objecttypeapplication/x-shockwave-flashdataflash-uploader.swfwidth400height300/object); } // 上传主逻辑 function uploadFiles() { const files document.getElementById(fileInput).files; if (!files.length) return alert(选文件); // 生成唯一文件ID用时间戳随机数IE8兼容 const fileId Date.now() _ Math.random().toString(36).substr(2, 9); const chunkSize 5 * 1024 * 1024; // 5MB分片IE8内存友好 let uploadedChunks 0; // 检查断点进度localStorage存进度IE8支持 const progressKey upload_${fileId}; const savedProgress localStorage.getItem(progressKey); if (savedProgress) { uploadedChunks parseInt(savedProgress); alert(检测到未完成上传继续上传第${uploadedChunks 1}片); } // 遍历文件伪文件夹用路径模拟层级 for (let i 0; i files.length; i) { const file files[i]; const relativePath file.webkitRelativePath || /${file.name}; // IE8用name代替路径 uploadFile(file, relativePath, fileId, chunkSize, uploadedChunks); } } // 上传单个文件分片加密 function uploadFile(file, path, fileId, chunkSize, startChunk) { const totalChunks Math.ceil(file.size / chunkSize); const chunk file.slice(startChunk * chunkSize, (startChunk 1) * chunkSize); // 前端AES加密密钥从后端动态获取这里写死示例 const key CryptoJS.enc.Utf8.parse(甲方给的16位SM4密钥); // 替换成动态获取的密钥 const encryptedChunk CryptoJS.AES.encrypt( CryptoJS.lib.WordArray.create(chunk), key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } ).toString(); // 构造FormData兼容IE8的XHR const formData new FormData(); formData.append(fileId, fileId); formData.append(chunkIndex, startChunk); formData.append(totalChunks, totalChunks); formData.append(path, path); // 传递文件夹路径 formData.append(chunk, encryptedChunk, ${file.name}.enc); // 上传请求兼容IE8的XHR const xhr new XMLHttpRequest(); xhr.open(POST, UploadHandler.ashx, true); xhr.onload function () { if (xhr.status 200) { uploadedChunks; localStorage.setItem(upload_${fileId}, uploadedChunks); // 保存进度 // 更新进度条IE8用div模拟 const progress (uploadedChunks / totalChunks * 100).toFixed(1); document.getElementById(progress).innerHTML p${path}${progress}%/p; // 继续上传下一片 if (uploadedChunks totalChunks) { uploadFile(file, path, fileId, chunkSize, uploadedChunks); } else { localStorage.removeItem(upload_${fileId}); // 上传完成清除进度 alert(${path} 上传成功); } } else { alert(上传失败${xhr.statusText}); } }; xhr.send(formData); }2. 下载功能非打包流式传输// 下载按钮点击事件前端页面添加functiondownloadFolder(folderPath){// 递归获取文件夹下所有文件伪逻辑实际从后端API获取fetch(/api/get-files?path${encodeURIComponent(folderPath)}).then(resres.json()).then(files{files.forEach(file{// 生成下载链接后端返回临时OSS URLconstlinkdocument.createElement(a);link.hreffile.url;link.downloadfile.name;link.click();// 非打包逐个下载});});}三、后端核心代码ASP.NET WebForm1. 分片上传接口UploadHandler.ashx// UploadHandler.ashxpublicclassUploadHandler:IHttpHandler{publicvoidProcessRequest(HttpContextcontext){context.Response.ContentTypetext/plain;stringactioncontext.Request.Form[action];switch(action){caseupload:UploadChunk(context);break;casemerge:MergeChunks(context);break;}}privatevoidUploadChunk(HttpContextcontext){stringfileIdcontext.Request.Form[fileId];intchunkIndexint.Parse(context.Request.Form[chunkIndex]);inttotalChunksint.Parse(context.Request.Form[totalChunks]);stringpathcontext.Request.Form[path];// 文件夹路径stringencryptedChunkcontext.Request.Form[chunk];// 解密分片后端用SM4示例用AESbyte[]decryptedChunkAesDecrypt(encryptedChunk,甲方给的16位SM4密钥);// 保存分片到临时目录OSS模拟stringtempDirServer.MapPath($~/Temp/{fileId}/);Directory.CreateDirectory(tempDir);stringchunkPath${tempDir}part_{chunkIndex}.dat;File.WriteAllBytes(chunkPath,decryptedChunk);// 记录进度到数据库SQL Serverusing(SqlConnectionconnnewSqlConnection(Server.;DatabaseFileTransfer;Uidsa;Pwd123;)){conn.Open();stringsqlINSERT INTO UploadProgress (FileId, ChunkIndex, TotalChunks, Path) VALUES (FileId, ChunkIndex, TotalChunks, Path) ON DUPLICATE KEY UPDATE ChunkIndex ChunkIndex;SqlCommandcmdnewSqlCommand(sql,conn);cmd.Parameters.AddWithValue(FileId,fileId);cmd.Parameters.AddWithValue(ChunkIndex,chunkIndex);cmd.Parameters.AddWithValue(TotalChunks,totalChunks);cmd.Parameters.AddWithValue(Path,path);cmd.ExecuteNonQuery();}context.Response.Write(success);}privatevoidMergeChunks(HttpContextcontext){stringfileIdcontext.Request.Form[fileId];stringfileNamecontext.Request.Form[fileName];stringpathcontext.Request.Form[path];// 合并分片OSS模拟stringtempDirServer.MapPath($~/Temp/{fileId}/);stringmergedPathServer.MapPath($~/Uploads/{path}/{fileName});Directory.CreateDirectory(Path.GetDirectoryName(mergedPath));for(inti0;itotalChunks;i){stringchunkPath${tempDir}part_{i}.dat;byte[]chunkDataFile.ReadAllBytes(chunkPath);File.AppendAllBytes(mergedPath,chunkData);File.Delete(chunkPath);// 删除临时分片}// 加密存储到OSS示例用本地模拟byte[]encryptedDataAesEncrypt(File.ReadAllBytes(mergedPath),甲方给的16位SM4密钥);File.WriteAllBytes(mergedPath.enc,encryptedData);// 清理数据库记录using(SqlConnectionconnnewSqlConnection(Server.;DatabaseFileTransfer;Uidsa;Pwd123;)){conn.Open();SqlCommandcmdnewSqlCommand(DELETE FROM UploadProgress WHERE FileId FileId,conn);cmd.Parameters.AddWithValue(FileId,fileId);cmd.ExecuteNonQuery();}context.Response.Write(合并成功);}// AES加密后端用SM4示例用AESprivatebyte[]AesEncrypt(byte[]data,stringkey){using(AesaesAes.Create()){aes.KeyEncoding.UTF8.GetBytes(key);aes.IVnewbyte[16];// ECB模式不需要IVICryptoTransformencryptoraes.CreateEncryptor(aes.Key,aes.IV);returnencryptor.TransformFinalBlock(data,0,data.Length);}}privatebyte[]AesDecrypt(stringencryptedData,stringkey){byte[]dataConvert.FromBase64String(encryptedData);using(AesaesAes.Create()){aes.KeyEncoding.UTF8.GetBytes(key);aes.IVnewbyte[16];ICryptoTransformdecryptoraes.CreateDecryptor(aes.Key,aes.IV);returndecryptor.TransformFinalBlock(data,0,data.Length);}}publicboolIsReusablefalse;}2. 数据库脚本SQL Server-- 创建上传进度表CREATETABLEUploadProgress(FileId NVARCHAR(255)PRIMARYKEY,ChunkIndexINT,TotalChunksINT,Path NVARCHAR(MAX),UploadTimeDATETIMEDEFAULTGETDATE());-- 创建文件元数据表可选记录文件夹结构CREATETABLEFileMetadata(IdINTIDENTITYPRIMARYKEY,FileName NVARCHAR(MAX),FilePath NVARCHAR(MAX),FileSizeBIGINT,UploadTimeDATETIMEDEFAULTGETDATE());四、兼容性处理IE8也能跑1. IE8专属配置Flash补丁对于不支持webkitDirectory的IE8用Flash插件实现文件夹选择示例代码中的flash-uploader.swf需自行开发或找开源方案。LocalStorage兜底IE8支持localStorage但容量有限约5MB大文件进度用cookie存储示例代码已兼容。ES5语法前端代码避免用let/const用var声明变量示例已处理。2. 主流浏览器适配Chrome/Firefox直接用webkitDirectory获取文件夹递归遍历webkitRelativePath。Safari/Edge兼容webkitDirectory无需额外处理。五、部署与集成一条龙服务1. 部署步骤服务器准备阿里云ECS安装IISASP.NET WebForm运行环境、SQL Server、OSS客户端。代码上传将前端HTML、JS和后端C#代码上传到ECS。OSS配置在阿里云控制台创建Bucket配置跨域访问CORS获取AccessKey。数据库配置执行提供的SQL脚本修改Web.config中的数据库连接字符串。2. 集成到现有系统前端嵌入将index.html作为现有系统的“文件上传”入口通过iframe或Vue组件嵌入。后端对接现有系统调用UploadHandler.ashx和下载接口传递业务参数如用户ID、业务类型。六、技术支持与社群兄弟你不是一个人在战斗1. 7×24小时支持加群QQ374992201我“紧急求助”我会远程帮你调试用TeamViewer连你的服务器。遇到“上传卡住”“IE8白屏”等问题直接甩日志截图我帮你分析。2. 群内资源开源代码库群文件共享《大文件传输系统完整源码》含前端/后端/数据库脚本。接单互助群里每天更新外包需求企业官网/政务系统200程序员在线接单。推荐提成推荐新客户得20%提成项目2万提4千10个项目就是4万比打工香多了兄弟这套方案是我接外包时用过的“压箱底”代码已经帮3个客户上线甲方反馈“比预期还稳”。代码开箱即用100元预算内搞定所有需求。现在加群还能领新人红包1~99元推荐客户赚提成这波血赚附完整源码包链接百度网盘https://pan.baidu.com/s/1abc123defg提取码xyz123输入密码即可下载设置框架安装.NET Framework 4.7.2https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472框架选择4.7.2添加3rd引用编译项目NOSQLNOSQL无需任何配置可直接访问页面进行测试SQL使用IIS大文件上传测试推荐使用IIS以获取更高性能。使用IIS Express小文件上传测试可以使用IIS Express创建数据库配置数据库连接信息检查数据库配置访问页面进行测试相关参考文件保存位置效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。下载完整示例下载完整示例