大文件上传优化
XMLHttpRequest
或Fetch API
分块上传,后端使用HttpPostedFile
接收并合并,避免内存溢出。 FileStream
逐块读写文件,避免一次性加载大文件到内存。服务器配置调整
web.config
中的maxRequestLength
(单位:KB)和executionTimeout
(单位:秒)以支持大文件上传。 <system.web> <httpRuntime maxRequestLength="102400" executionTimeout="360" /> </system.web>
异步与队列管理
async/await
)处理上传任务,避免阻塞主线程。 分块上传前端示例
function uploadFile(file) { const chunkSize = 1 * 1024 * 1024; // 1MB/块 let start = 0; function uploadChunk() { if (start >= file.size) return; const chunk = file.slice(start, start + chunkSize); const formData = new FormData(); formData.append('chunk', chunk); formData.append('fileName', file.name); fetch('/api/upload/chunk', { method: 'POST', body: formData }) .then(() => { start += chunkSize; uploadChunk(); // 递归上传下一块 }); } uploadChunk(); }
后端分块合并逻辑
private static readonly Dictionary<string, List<byte[]>> chunks = new(); [HttpPost("chunk")] public IActionResult UploadChunk(byte[] chunk, string fileName) { if (!chunks.ContainsKey(fileName)) chunks[fileName] = new List<byte[]>(); chunks[fileName].Add(chunk); return Ok("分块上传成功"); } [HttpPost("merge")] public IActionResult MergeChunks(string fileName) { var allBytes = chunks[fileName].SelectMany(c => c).ToArray(); System.IO.File.WriteAllBytes($"uploads/{fileName}", allBytes); chunks.Remove(fileName); return Ok("文件合并成功"); }
流式下载实现
[HttpGet("download")] public FileStreamResult DownloadFile(string filePath) { var stream = new FileStream(filePath, FileMode.Open); return File(stream, "application/octet-stream", Path.GetFileName(filePath)); }
安全防护
.docx
, .pdf
等)和大小,防止恶意文件上传。 FileUpload.PostedFile.ContentType
验证MIME类型,避免伪造扩展名攻击。用户体验优化
XMLHttpRequest.upload.onprogress
事件)。 存储策略
📚 参考来源与日期
本文由 云厂商 于2025-08-01发表在【云服务器提供商】,文中图片由(云厂商)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/fwqgy/509400.html
发表评论