1. 创建ASP.NET MVC 项目
首先,打开 Visual Studio,创建一个新的ASP.NET Web 应用程序项目,选择 MVC 模板。
2. 创建模型类
在
Models
文件夹下创建一个简单的模型类用于处理文件上传,例如FileUploadModel.cs
:using System.Web;
namespace YourNamespace.Models
{
public class FileUploadModel
{
public HttpPostedFileBase UploadedFile { get; set; }
}
}
HttpPostedFileBase
是ASP.NET MVC 中用于处理上传文件的抽象类,它封装了上传文件的相关信息和操作方法。
3. 创建控制器
在
Controllers
文件夹下创建一个控制器,例如FileUploadController.cs
:using System.IO;
using System.Web;
using System.Web.Mvc;
using YourNamespace.Models;
namespace YourNamespace.Controllers
{
public class FileUploadController : Controller
{
// 显示文件上传视图
public ActionResult Index()
{
return View();
}
// 处理文件上传的POST请求
[HttpPost]
public ActionResult Index(FileUploadModel model)
{
if (model.UploadedFile != null && model.UploadedFile.ContentLength > 0)
{
try
{
// 获取上传文件的文件名
string fileName = Path.GetFileName(model.UploadedFile.FileName);
// 定义保存文件的路径,这里假设保存到项目的App_Data文件夹下
string path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
// 保存文件到指定路径
model.UploadedFile.SaveAs(path);
ViewBag.Message = "文件上传成功!";
}
catch (Exception ex)
{
ViewBag.Message = "文件上传失败: " + ex.Message;
}
}
else
{
ViewBag.Message = "请选择要上传的文件。";
}
return View(model);
}
}
}
在上述代码中,
Index
方法的GET
请求用于返回文件上传的视图,POST
请求用于处理文件上传操作。当文件成功上传时,会将文件保存到指定路径并显示成功消息;若上传过程中出现异常,则显示错误消息。
4. 创建视图
在
Views
文件夹下创建一个与控制器对应的文件夹FileUpload
,并在其中创建Index.cshtml
视图文件:@model YourNamespace.Models.FileUploadModel
@{
ViewBag.Title = "文件上传";
}
<h2>文件上传</h2>
@using (Html.BeginForm("Index", "FileUpload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
<label for="UploadedFile">选择文件</label>
<input type="file" name="UploadedFile" id="UploadedFile" />
</div>
<button type="submit" class="btn btn-default">上传</button>
@if (ViewBag.Message != null)
{
<div class="alert alert-info">
@ViewBag.Message
</div>
}
}
这里使用
Html.BeginForm
方法创建一个表单,指定表单的提交地址为FileUpload
控制器的Index
方法,同时设置表单的enctype
属性为multipart/form-data
,以支持文件上传。在表单中添加一个文件选择框和一个提交按钮,并根据ViewBag.Message
的值显示上传结果信息。
注意事项
1. 表单属性设置
enctype
属性:必须将表单的enctype
属性设置为multipart/form-data
,这样浏览器才会以正确的格式编码包含文件的表单数据。在ASP.NET MVC 中,使用Html.BeginForm
方法创建表单时,可以通过传递new { enctype = "multipart/form-data" }
来设置该属性。method
属性:表单的method
属性必须设置为POST
,因为文件上传需要使用POST
请求来传输数据。
2. 文件大小限制
- IIS 配置:默认情况下,IIS 对上传文件的大小有限制,一般为 4MB。可以通过修改
web.config
文件来增加这个限制。例如:
<system.web>
<httpRuntime maxRequestLength="102400" executionTimeout="3600" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
</system.webServer>
上述配置将文件上传大小限制提高到了 100MB(
maxRequestLength
单位为 KB,maxAllowedContentLength
单位为字节),同时设置了请求执行超时时间为 3600 秒。- 服务器资源:在提高文件上传大小限制时,要考虑服务器的磁盘空间、内存等资源,避免因大量大文件上传导致服务器性能下降甚至崩溃。
3. 文件保存路径
- 安全性:选择合适的保存路径,避免将上传的文件保存到网站的根目录或可执行文件目录下,以防恶意用户上传可执行文件并执行攻击。建议将文件保存到专门的文件夹中,如
App_Data
文件夹,该文件夹默认是不允许直接通过浏览器访问的。 - 路径管理:使用
Server.MapPath
方法将相对路径转换为服务器上的物理路径,确保文件保存到正确的位置。
4. 文件名处理
- 唯一性:为了避免文件名冲突,建议在保存文件时为文件名添加唯一标识,例如使用 GUID(全局唯一标识符)。可以通过以下方式实现:
string fileName = Path.GetFileName(model.UploadedFile.FileName);
string fileExtension = Path.GetExtension(fileName);
string uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
string path = Path.Combine(Server.MapPath("~/App_Data"), uniqueFileName);
- 合法性检查:对上传的文件名进行合法性检查,过滤掉包含特殊字符或恶意代码的文件名,防止路径遍历攻击等安全问题。
5. 异常处理
在文件上传过程中,可能会出现各种异常,如文件保存失败、磁盘空间不足等。因此,要在代码中进行适当的异常处理,捕获并记录异常信息,同时给用户友好的提示,避免程序崩溃。
6. 安全防护
- Anti - Forgery Token:在表单中使用
@Html.AntiForgeryToken()
生成防伪标记,并在控制器方法上添加[ValidateAntiForgeryToken]
属性,以防止跨站请求伪造(CSRF)攻击。 - 文件类型检查:对上传的文件类型进行检查,只允许上传允许的文件类型,避免用户上传恶意文件。可以通过检查文件的扩展名或文件的 MIME 类型来实现。例如:
string[] allowedExtensions = { ".jpg", ".png", ".pdf" };
string fileExtension = Path.GetExtension(model.UploadedFile.FileName).ToLower();
if (!allowedExtensions.Contains(fileExtension))
{
ViewBag.Message = "只允许上传JPG、PNG和PDF文件。";
return View(model);
}