在ASP.NET Core应用开发中,使用C#处理文件上传是非常常见的需求,核心是通过IFormFile接口接收前端传递的文件数据,再完成后续的存储或者处理操作。

单文件上传基础实现
单文件上传是最基础的上传场景,前端通过表单提交文件,后端在控制器中通过IFormFile类型的参数接收文件。
前端表单示例
<form action="/Upload/Single" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">上传</button>
</form>
后端控制器实现
后端需要先注入IWebHostEnvironment获取项目路径,再判断文件是否为空,最后将文件保存到指定目录。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Hosting;
using System.IO;
using System.Threading.Tasks;
namespace UploadDemo.Controllers
{
public class UploadController : Controller
{
private readonly IWebHostEnvironment _env;
public UploadController(IWebHostEnvironment env)
{
_env = env;
}
[HttpPost]
public async Task<IActionResult> Single(IFormFile file)
{
if (file == null || file.Length == 0)
{
return Content("未选择文件");
}
// 获取项目根目录下的uploads文件夹路径
string uploadPath = Path.Combine(_env.WebRootPath, "uploads");
// 如果文件夹不存在则创建
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
// 生成唯一文件名,避免重名覆盖
string fileName = $"{Path.GetFileNameWithoutExtension(file.FileName)}_{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
string filePath = Path.Combine(uploadPath, fileName);
// 保存文件
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
return Content($"文件上传成功,保存路径:{filePath}");
}
}
}
多文件上传实现
多文件上传只需要将接收参数改为IFormFile集合即可,前端表单的input标签添加multiple属性允许选择多个文件。
前端表单示例
<form action="/Upload/Multiple" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple />
<button type="submit">批量上传</button>
</form>
后端控制器实现
[HttpPost]
public async Task<IActionResult> Multiple(List<IFormFile> files)
{
if (files == null || files.Count == 0)
{
return Content("未选择文件");
}
string uploadPath = Path.Combine(_env.WebRootPath, "uploads");
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
foreach (var file in files)
{
if (file.Length > 0)
{
string fileName = $"{Path.GetFileNameWithoutExtension(file.FileName)}_{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
string filePath = Path.Combine(uploadPath, fileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
}
}
return Content($"共上传{successCount}个文件,全部上传成功");
}
限制上传文件的类型和大小
为了避免上传恶意文件或者过大的文件占用服务器资源,需要对上传文件做类型和大小限制。
大小限制配置
可以在Program.cs中全局配置上传文件大小限制,也可以在控制器方法上单独配置。
// Program.cs中全局配置,限制单个文件最大20MB,请求总大小最大60MB
builder.Services.Configure<FormOptions>(options =>
{
options.MultipartBodyLengthLimit = 60 * 1024 * 1024; // 60MB
});
// 控制器方法上单独配置特性,限制该接口单个文件最大10MB
[HttpPost]
[RequestSizeLimit(10 * 1024 * 1024)] // 10MB
public async Task<IActionResult> Single(IFormFile file)
{
// 原有逻辑
}
文件类型限制
可以通过判断文件的扩展名或者Content-Type来限制允许上传的文件类型,比如只允许上传图片文件。
[HttpPost]
public async Task<IActionResult> UploadImage(IFormFile file)
{
// 允许的文件扩展名
string[] allowedExtensions = { ".jpg", ".jpeg", ".png", ".gif" };
string fileExtension = Path.GetExtension(file.FileName).ToLower();
if (!allowedExtensions.Contains(fileExtension))
{
return Content("只允许上传jpg、jpeg、png、gif格式的图片文件");
}
// 也可以校验Content-Type
string[] allowedContentTypes = { "image/jpeg", "image/png", "image/gif" };
if (!allowedContentTypes.Contains(file.ContentType.ToLower()))
{
return Content("文件类型不合法");
}
// 后续保存逻辑
}
注意事项
- 不要直接使用前端传递的文件名作为保存的文件名,避免路径遍历攻击,比如前端传递
../../web.config这类文件名会修改服务器其他文件。 - 上传的文件如果需要公开访问,要放在
wwwroot目录下,并且注意设置合适的访问权限。 - 大文件上传可以考虑分片上传的方式,避免单次请求时间过长导致超时。
- 上传完成后可以对文件做病毒扫描,避免上传恶意文件到服务器。
C#ASP.NET_Core文件上传IFormFile修改时间:2026-06-15 02:57:31