在C#中实现文件下载功能通常涉及Web应用程序开发,尤其是使用ASP.NET Core或传统的ASP.NET Web Forms/MVC框架。以下是这两种框架下实现文件下载的基本步骤和示例代码。
使用ASP.NET Core进行文件下载
Controller部分
在控制器中提供一个动作方法让用户下载文件。
csharp
using Microsoft.AspNetCore.Mvc;
using System.IO;
public class FileDownloadController : Controller
{
[HttpGet("download/{fileName}")]
public IActionResult DownloadFile(string fileName)
{
// 定义文件路径
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads", fileName);
// 检查文件是否存在
if (!System.IO.File.Exists(filePath))
{
return NotFound("File not found.");
}
// 读取文件字节
var fileBytes = System.IO.File.ReadAllBytes(filePath);
// 返回文件作为响应
return File(fileBytes, GetContentType(fileName), fileName);
}
private string GetContentType(string fileName)
{
var types = GetMimeTypes();
var ext = Path.GetExtension(fileName).ToLowerInvariant();
return types.ContainsKey(ext) ? types[ext] : "application/octet-stream";
}
private static Dictionary<string, string> GetMimeTypes()
{
return new Dictionary<string, string>
{
{ ".txt", "text/plain" },
{ ".pdf", "application/pdf" },
{ ".doc", "application/msword" },
{ ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
{ ".xls", "application/vnd.ms-excel" },
{ ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
{ ".png", "image/png" },
{ ".jpg", "image/jpeg" },
{ ".jpeg", "image/jpeg" },
{ ".gif", "image/gif" }
};
}
}
使用传统ASP.NET MVC进行文件下载
Controller部分
提供一个动作方法让用户下载文件。
csharp
using System.IO;
using System.Web.Mvc;
public class HomeController : Controller
{
[HttpGet]
public ActionResult DownloadFile(string fileName)
{
// 定义文件路径
var filePath = Server.MapPath($"~/App_Data/uploads/{fileName}");
// 检查文件是否存在
if (!System.IO.File.Exists(filePath))
{
return HttpNotFound("File not found.");
}
// 读取文件字节
var fileBytes = System.IO.File.ReadAllBytes(filePath);
// 返回文件作为响应
return File(fileBytes, GetContentType(fileName), fileName);
}
private string GetContentType(string fileName)
{
var types = GetMimeTypes();
var ext = Path.GetExtension(fileName).ToLowerInvariant();
return types.ContainsKey(ext) ? types[ext] : "application/octet-stream";
}
private static Dictionary<string, string> GetMimeTypes()
{
return new Dictionary<string, string>
{
{ ".txt", "text/plain" },
{ ".pdf", "application/pdf" },
{ ".doc", "application/msword" },
{ ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
{ ".xls", "application/vnd.ms-excel" },
{ ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
{ ".png", "image/png" },
{ ".jpg", "image/jpeg" },
{ ".jpeg", "image/jpeg" },
{ ".gif", "image/gif" }
};
}
}
注意事项
- 文件存在性检查: 在返回文件之前,确保文件存在于指定路径中。
- 内容类型设置: 正确设置文件的内容类型,以便浏览器能够正确处理文件。
- 错误处理: 添加适当的错误处理逻辑,以便在文件不存在或其他错误发生时向用户提供有意义的反馈。
通过以上步骤和示例代码,您可以在ASP.NET Core和传统ASP.NET MVC应用程序中实现文件下载功能。根据具体需求,您可以进一步扩展和优化这些代码。