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; }
    }
}
HttpPostedFileBaseASP.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);
}