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 分钟部署完成。随时说一声!