ASP.NET Web Pages – 文件

ASP.NET Web Pages(Razor)中文件操作全攻略

(2025 年依然最实用、最全面、最安全的写法)

一、核心文件操作对象(直接可用,无需引用)

对象作用常用方法
File操作单个文件.Exists().OpenText().ReadAllText().WriteAllText().Delete().Copy()
Directory操作文件夹.Exists().CreateDirectory().GetFiles().Delete()
Path处理路径字符串(强烈推荐).Combine().GetExtension().GetFileName().GetDirectoryName()
Server路径映射(必须配合使用)Server.MapPath("~/Uploads/")
Request.Files接收用户上传的文件(最常用)Request.Files["file"].SaveAs()

二、常用文件操作 99% 场景代码(直接复制)

// 1. 判断文件是否存在
if (File.Exists(Server.MapPath("~/App_Data/config.json"))) { ... }

// 2. 读取文本文件(最常用)
var content = File.ReadAllText(Server.MapPath("~/App_Data/welcome.txt"));
var lines   = File.ReadAllLines(Server.MapPath("~/App_Data/links.txt"));

// 3. 写入/追加文本(自动创建文件)
File.WriteAllText(Server.MapPath("~/logs/log.txt"), "网站启动于 " + DateTime.Now);
File.AppendAllText(Server.MapPath("~/logs/log.txt"), "\r\n用户访问:" + Request.UserHostAddress);

// 4. 创建文件夹(如果不存在)
var uploadPath = Server.MapPath("~/Uploads/2025/11/");
if (!Directory.Exists(uploadPath)) {
    Directory.CreateDirectory(uploadPath);
}

// 5. 获取文件夹下所有文件
var files = Directory.GetFiles(uploadPath, "*.jpg");  // 只取 jpg
foreach(var f in files) {
    <p>@Path.GetFileName(f)</p>
}

三、最安全的文件上传写法(2025 年推荐版)

<!-- Upload.cshtml -->
<form method="post" enctype="multipart/form-data">
    @AntiForgery.GetHtml()
    <p>上传图片:<input type="file" name="photos" multiple accept="image/*" /></p>
    <button>上传</button>
</form>

@if(IsPost){
    AntiForgery.Validate();

    var savePath = Server.MapPath("~/Uploads/Photos/" + DateTime.Now.ToString("yyyyMM"));
    if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);

    var uploadedFiles = Request.Files["photos"];
    for(int i = 0; i < uploadedFiles.Count; i++){
        var file = uploadedFiles[i];
        if(file.ContentLength > 0){
            // 防止恶意文件名
            var fileName = Path.GetFileName(file.FileName);
            fileName = DateTime.Now.ToString("HHmmss_") + Guid.NewGuid().ToString("N").Substring(0,8) + Path.GetExtension(fileName);

            // 限制大小(< 5MB)和类型
            if(file.ContentLength > 5*1024*1024){
                <div style="color:red">@file.FileName 太大,禁止上传</div>
                continue;
            }
            var ext = Path.GetExtension(fileName).ToLower();
            if(!".jpg.jpeg.png.gif.webp".Contains(ext)){
                <div style="color:red">@file.FileName 类型不允许</div>
                continue;
            }

            file.SaveAs(savePath + fileName);
            <div>上传成功:<a href="~/Uploads/Photos/@(DateTime.Now:yyyyMM)/@fileName" target="_blank">@file.FileName</a></div>
        }
    }
}

四、文件下载(超级实用)

<!-- Download.cshtml?id=123 -->
@{
    var fileId = UrlData[0].AsInt();  // 或者 Request["id"]
    var db = Database.Open("MySite");
    var row = db.QuerySingle("SELECT FilePath,FileName FROM Files WHERE Id=@0", fileId);

    if(row != null){
        var physicalPath = Server.MapPath(row.FilePath);
        if(File.Exists(physicalPath)){
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + 
                Url.Encode(row.FileName ?? "download.file"));
            Response.WriteFile(physicalPath);
            Response.End();
        }
    }
}

五、完整文件管理器示例(复制即用)

<!-- Files/Index.cshtml -->
@{
    var folder = "~/Uploads/Documents/";
    var physical = Server.MapPath(folder);
    var files = Directory.Exists(physical) 
        ? Directory.GetFiles(physical).OrderByDescending(f => new FileInfo(f).LastWriteTime)
        : new string[0];
}

<h2>文档管理</h2>
<form method="post" enctype="multipart/form-data">
    @AntiForgery.GetHtml()
    <input type="file" name="doc" />
    <button>上传文档</button>
</form>

@if(IsPost){
    AntiForgery.Validate();
    var f = Request.Files["doc"];
    if(f?.ContentLength > 0){
        var name = Path.GetFileName(f.FileName);
        f.SaveAs(physical + name);
        Response.Redirect(Request.Url.PathAndQuery);
    }
}

<hr>
<table border="1" width="100%">
<tr><th>文件名</th><th>大小</th><th>修改时间</th><th>操作</th></tr>
@foreach(var f in files){
    var info = new FileInfo(f);
    <tr>
        <td><a href="@(folder + info.Name)" target="_blank">@info.Name</a></td>
        <td>@(info.Length/1024) KB</td>
        <td>@info.LastWriteTime.ToString("yyyy-MM-dd HH:mm")</td>
        <td>
            <a href="?del=@info.Name" onclick="return confirm('确定删除?')">删除</a>
        </td>
    </tr>
}
</table>

@if(Request["del"].IsEmpty() == false){
    var delFile = Server.MapPath(folder + Request["del"]);
    if(File.Exists(delFile)) File.Delete(delFile);
    Response.Redirect("~/Files/");
}

六、终极安全建议(2025 版)

// 永远不要信任用户上传的文件名
var safeName = Guid.NewGuid().ToString("N") + Path.GetExtension(originalName);

// 永远不要把上传目录设为可执行(如 .cshtml)
<!-- Web.config 放在 Uploads 文件夹下 -->
<?xml version="1.0"?>
<configuration>
  <system.webServer>
    <handlers>
      <clear/>
      <add name="BlockAll" path="*" verb="*" type="System.Web.HttpForbiddenHandler"/>
    </handlers>
  </system.webServer>
</configuration>

总结:文件操作必背 5 行代码

Server.MapPath("~/xxx")                 // 1. 虚拟转物理路径(必须)
File.Exists(path)                       // 2. 判断文件
File.ReadAllText / WriteAllText         // 3. 读写文本
Directory.CreateDirectory(path)         // 4. 创建文件夹
Request.Files["xxx"].SaveAs(savePath)   // 5. 保存上传文件

记住这 5 行,你在 ASP.NET Web Pages 里想操作任何文件都毫无压力!

需要我打包一个「完整文件管理后台」(支持上传、下载、删除、预览、按日期分文件夹、缩略图)发给你吗?纯 Razor 实现,500KB 就能跑,5 分钟部署完成。随时说一声!

文章已创建 2863

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部