📢 最新动态
微软在2025年8月发布的.NET 8更新中,强化了文件上传的安全性,并推荐使用IFormFile
接口处理多文件上传,第三方组件如Dropzone.js已完美适配ASP.NET Core,支持拖拽上传和进度可视化!
环境要求
创建项目
dotnet new mvc -n MultiFileUpload cd MultiFileUpload
在wwwroot/js
中添加Dropzone.js库,或通过CDN引入:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/dropzone.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>
在Views/Home/Index.cshtml
中创建拖拽区域:
<form action="/Home/UploadFiles" class="dropzone" id="myDropzone" enctype="multipart/form-data"></form> <script> Dropzone.options.myDropzone = { paramName: "files", // 对应后端参数名 maxFilesize: 10, // MB acceptedFiles: ".jpg,.png,.pdf", // 限制文件类型 init: function() { this.on("success", function(file, response) { alert("上传成功:" + response.message); }); } }; </script>
在Controllers/HomeController.cs
中添加上传方法:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; [HttpPost] public async Task<IActionResult> UploadFiles(ListormFile> files) { var uploadPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads"); foreach (var file in files) { if (file.Length > 0) { var fileName = Guid.NewGuid() + Path.GetExtension(file.FileName); // 防止重名 var filePath = Path.Combine(uploadPath, fileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } } } return Json(new { success = true, message = "文件上传成功!" }); }
在Program.cs
中启用静态文件服务:
app.UseStaticFiles();
文件类型白名单
var allowedExts = new[] { ".jpg", ".png", ".pdf" }; var ext = Path.GetExtension(file.FileName).ToLower(); if (!allowedExts.Contains(ext)) throw new Exception("非法文件类型!");
文件大小限制
if (file.Length > 10 * 1024 * 1024) // 10MB throw new Exception("文件过大!");
存储路径隔离
wwwroot
同级目录/uploads
)防注入攻击
var fileName = Path.GetRandomFileName() + ext; // 随机文件名
权限控制
在web.config
中禁用上传目录执行权限:
<location path="uploads"> <system.webServer> <handlers accessPolicy="Script, Read" /> </system.webServer> </location>
模拟压力测试
使用Postman发送包含5个100MB文件的请求,验证流式传输是否生效。
前端体验优化
parallelUploads: 3
dictDefaultMessage: "点击选择或拖拽文件到这里"
日志监控
在appsettings.json
中配置Serilog记录上传事件:
"Serilog": { "WriteTo": [ { "Name": "File", "Args": { "path": "logs/upload-.log" } } ] }
Docker化
FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY . . ENTRYPOINT ["dotnet", "MultiFileUpload.dll"]
反向代理配置
在Nginx中设置上传大小限制:
client_max_body_size 50M;
云存储集成(可选)
替换本地存储为Azure Blob或AWS S3:
await file.CopyToAsync(blobClient.OpenWrite(true));
Q:上传大文件时出现500错误?
A:检查web.config
中的maxRequestLength
和executionTimeout
:
<system.web> <httpRuntime maxRequestLength="2097152" executionTimeout="3600" /> </system.web>
Q:如何显示上传进度?
A:在Dropzone配置中添加:
this.on("totaluploadprogress", function(progress) { document.querySelector("#progress-bar").style.width = progress + "%"; });
🎯
通过结合ASP.NET Core内置的IFormFile
和第三方组件Dropzone.js,可快速实现安全高效的多文件上传功能,记得定期扫描上传文件,并保持.NET运行时更新至最新版本!
本文由 业务大全 于2025-08-25发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vds.7tqx.com/wenda/725336.html
发表评论