ASP.NET MVC电商项目:更新图片时如何删除旧文件?
解决ASP.NET MVC电商应用更新图片时旧文件未删除的问题
你的代码目前仅实现了新图片的上传与数据库路径更新,未处理旧图片文件的删除逻辑。以下是修改后的完整代码,包含旧文件删除步骤:
核心修改说明
- 先从数据库查询当前分类的原始记录,获取旧图片路径
- 上传新图片并成功更新数据库后,删除服务器上的旧图片文件
- 增加文件存在性判断,避免因旧路径无效引发异常
修改后的完整代码
public async Task<IActionResult> Edit(int id, [Bind("Id,Name,Image,Description,Status,CreatedBy,CreatedDate,ModifiedBy,ModifiedDate,SeoData,MetaData")] Category category, IFormFile Img) { if (id != category.Id) { return NotFound(); } // 获取数据库中原始分类记录,提取旧图片路径 var originalCategory = await _context.Categories.FindAsync(id); if (originalCategory == null) { return NotFound(); } string finalPath = null; // 仅在上传了有效新图片时处理文件操作 if (Img != null && Img.Length > 0) { finalPath = "/data/category/pics/" + Guid.NewGuid().ToString() + Path.GetExtension(Img.FileName); using (FileStream fs = new FileStream(_he.WebRootPath + finalPath, FileMode.Create)) { await Img.CopyToAsync(fs); } } if (ModelState.IsValid) { try { if (!string.IsNullOrEmpty(finalPath)) { // 更新分类的图片路径 category.Image = finalPath; // 删除服务器上的旧图片文件 var oldImageFullPath = _he.WebRootPath + originalCategory.Image; if (System.IO.File.Exists(oldImageFullPath)) { System.IO.File.Delete(oldImageFullPath); } } else { // 未上传新图时,保留原图片路径 category.Image = originalCategory.Image; } _context.Update(category); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!CategoryExists(category.Id)) { return NotFound(); } else { throw; } } return RedirectToAction(nameof(Index)); } return View(category); }
额外注意事项
- 确保应用程序对目标文件夹拥有写入/删除权限,否则删除操作会失败
- 若存在全局默认占位图,需增加判断逻辑,避免误删默认图片
- 建议将文件路径前缀(如
/data/category/pics/)提取为配置项,便于后续维护
内容的提问来源于stack exchange,提问作者Abdul Manan
相关产品推荐
相关产品推荐

