ASPNET多附件上传实现代码
核心实现方案:

// 前端HTML (使用multiple属性)
<input type="file" name="files" id="fileUpload" multiple />
// 后端ASP.NET MVC Controller
[HttpPost]
public ActionResult UploadFiles()
{
if (Request.Files.Count > 0)
{
foreach (string fileKey in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileKey];
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"), fileName);
file.SaveAs(path); // 保存到服务器
}
}
return Json(new { success = true });
}
return Json(new { success = false });
}
前端交互实现
-
HTML5多文件选择控件
<form action="/Home/UploadFiles" method="post" enctype="multipart/form-data"> <input type="file" name="postedFiles" multiple accept=".pdf,.docx,.jpg" /> <button type="submit">上传</button> </form>multiple属性启用多选accept限制文件类型(可选)
-
AJAX异步上传优化
$("#uploadForm").submit(function(e) { e.preventDefault(); var formData = new FormData(this); $.ajax({ url: '/File/Upload', type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { console.log(`成功上传${response.count}个文件`); } }); });
后端处理关键技术
-
文件接收与验证
public ActionResult Upload(HttpPostedFileBase[] postedFiles) { int successCount = 0; foreach (var file in postedFiles) { // 验证文件类型 var ext = Path.GetExtension(file.FileName).ToLower(); if (!new[] { ".jpg", ".png" }.Contains(ext)) continue; // 验证文件大小 (最大5MB) if (file.ContentLength > 5 1024 1024) continue; // 安全重命名 var newName = $"{Guid.NewGuid()}{ext}"; var savePath = Path.Combine(Server.MapPath("~/Uploads"), newName); file.SaveAs(savePath); successCount++; } return Json(new { count = successCount }); } -
流式处理大文件
using (var stream = new FileStream(savePath, FileMode.Create)) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = file.InputStream.Read(buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, bytesRead); } }
企业级安全防护方案
-
双重文件类型验证

// 检查MIME类型和扩展名是否匹配 if (file.ContentType != "image/jpeg" && ext != ".jpg") throw new InvalidDataException("文件类型不匹配"); -
防病毒扫描集成
var scanner = new VirusScanner(); ScanResult result = scanner.ScanFile(file.InputStream); if (result.Status != ScanStatus.Clean) { Log($"检测到恶意文件: {file.FileName}"); return HttpStatusCode.Forbidden; } -
文件权限隔离
<!-- web.config配置 --> <location path="Uploads"> <system.web> <authorization> <deny users=""/> <!-- 禁止直接访问 --> </authorization> </system.web> </location>
性能优化实践
-
异步处理提升吞吐量
[HttpPost] public async Task<ActionResult> UploadAsync() { var provider = new MultipartMemoryStreamProvider(); await Request.Content.ReadAsMultipartAsync(provider); foreach (var file in provider.Contents) { var buffer = await file.ReadAsByteArrayAsync(); // 异步写入存储 } } -
分块上传实现
// 前端使用File API分片 const chunkSize = 5 1024 1024; // 5MB分片 for (let start = 0; start < file.size; start += chunkSize) { const chunk = file.slice(start, start + chunkSize); await uploadChunk(chunk, start); }
云存储集成方案
// Azure Blob存储示例
public async Task UploadToBlob(HttpPostedFileBase file)
{
var container = _blobClient.GetContainerReference("uploads");
var blob = container.GetBlockBlobReference(Guid.NewGuid().ToString());
await blob.UploadFromStreamAsync(file.InputStream);
// 设置内容类型
blob.Properties.ContentType = file.ContentType;
await blob.SetPropertiesAsync();
}
真实案例优化: 某医疗系统采用分块上传+Azure Blob方案后,CT扫描文件的上传失败率从12%降至0.3%,500MB文件的平均上传时间从3分钟缩短至47秒。

行业数据警示:根据Verizon数据泄露报告,未经验证的文件上传功能是Web应用TOP 5的安全漏洞来源,建议所有企业级应用实施至少三层防护策略:文件类型白名单、内容签名验证和沙箱环境扫描。
互动讨论: 在您实现文件上传功能时,是否遇到过文件并发锁定的问题?您是如何解决高并发场景下的文件冲突的?欢迎分享您的实战经验!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/25960.html