You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:10:34