ASP.NET Core 5实现数据库文件下载并保存至wwwroot目录
ASP.NET Core 5 实现从数据库下载文件到wwwroot目录
已在ASP.NET Core 5中实现将文件上传至documentUploadProvinceLevels数据库表的功能,现需实现文件下载功能,将下载的文件保存至项目的wwwroot目录。
上传代码
public bool UploadAvatarProvinceDB(IFormFile file, RegisterViewModel document) { if (file != null) { if (file.Length > 0) { int department = 1; document.uploadDate = DateTime.Now; document.fileName = "no-document"; document.description = "ثبت تصویر پرسنل"; var docName = Path.GetFileName(file.FileName); var fileExtension = Path.GetExtension(docName); var newFileName = String.Concat(document.nationalCode, fileExtension); var objfiles = new DocumentUploadProvinceLevel() { id = 0, fileName = newFileName, uploadDate = DateTime.Now, title = "تصویر پرسنل", fileFormat = fileExtension, userId = document.nationalCode, description = document.description, department = department, IsDelete=false }; using (var target = new MemoryStream()) { file.CopyTo(target); objfiles.dataBytes = target.ToArray(); } _context.documentUploadProvinceLevels.Add(objfiles); _context.SaveChanges(); return true; } } return false; }
数据库表结构

解决方案
1. 注入环境依赖
在服务类或控制器中注入IWebHostEnvironment,用于获取wwwroot目录的绝对路径:
private readonly IWebHostEnvironment _webHostEnv; private readonly YourDbContext _dbContext; // 构造函数注入依赖 public FileService(YourDbContext dbContext, IWebHostEnvironment webHostEnv) { _dbContext = dbContext; _webHostEnv = webHostEnv; }
2. 实现下载保存逻辑
创建方法从数据库读取文件字节流,写入到wwwroot指定目录:
public bool SaveFileToWwwroot(string userId) { // 根据用户ID查询有效文件记录 var fileRecord = _dbContext.documentUploadProvinceLevels .FirstOrDefault(d => d.userId == userId && !d.IsDelete); if (fileRecord == null || fileRecord.dataBytes == null) { return false; } // 定义wwwroot下的目标存储目录(示例:wwwroot/UploadedFiles) string targetDir = Path.Combine(_webHostEnv.WebRootPath, "UploadedFiles"); // 目录不存在则创建 if (!Directory.Exists(targetDir)) { Directory.CreateDirectory(targetDir); } // 拼接完整文件路径 string fullFilePath = Path.Combine(targetDir, fileRecord.fileName); // 将字节数组写入文件 File.WriteAllBytes(fullFilePath, fileRecord.dataBytes); return true; }
3. 控制器接口调用
在控制器中暴露接口,供外部触发下载保存操作:
[ApiController] [Route("api/[controller]")] public class FileController : ControllerBase { private readonly FileService _fileService; public FileController(FileService fileService) { _fileService = fileService; } [HttpGet("save-to-wwwroot/{userId}")] public IActionResult SaveFile(string userId) { bool isSuccess = _fileService.SaveFileToWwwroot(userId); if (isSuccess) { return Ok("文件已成功保存至wwwroot/UploadedFiles目录"); } return NotFound("未找到对应有效文件"); } }
注意事项
- 确保部署环境中wwwroot目录具备写入权限,避免保存失败。
- 可根据需求调整目标目录结构(例如按用户ID创建子目录),避免文件名冲突。
- 如果需要同时支持返回文件给前端下载,可在控制器中直接返回
File(fileRecord.dataBytes, "application/octet-stream", fileRecord.fileName)。
内容的提问来源于stack exchange,提问作者Ashkan Amjad
相关产品推荐
相关产品推荐

