You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core 2.0上传图片后调整尺寸并多尺寸保存的解决方案

我懂你在ASP.NET Core 2.0里碰的这个难题——之前用的ImageResizer或者CoreCompat.System.Drawing都跟Core 2.0不兼容,找解决方案确实费劲儿。刚好有个完美适配的工具:SixLabors.ImageSharp,这是专门为.NET生态打造的高性能图片处理库,完全支持Core 2.0,下面给你一步步讲怎么实现:

解决方案:使用SixLabors.ImageSharp实现多尺寸图片保存

1. 安装适配的NuGet包

先给项目装上ImageSharp的核心包,打开NuGet包管理器控制台,运行:
Install-Package SixLabors.ImageSharp
或者在Visual Studio的NuGet界面搜索安装,注意选适配.NET Core 2.0的版本(推荐1.x系列,2.x版本对.NET版本要求更高)

2. 完整的上传与多尺寸处理代码

下面是对应你MVC4代码的ASP.NET Core 2.0版本实现,关键步骤都加了注释:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using System.Collections.Generic;
using System.IO;

public class UploadController : Controller
{
    private readonly IHostingEnvironment _hostingEnv;

    // ASP.NET Core里用依赖注入获取网站根路径,替代旧的Server.MapPath
    public UploadController(IHostingEnvironment hostingEnv)
    {
        _hostingEnv = hostingEnv;
    }

    [HttpPost]
    public IActionResult Upload(IFormFile file)
    {
        if (file != null && file.Length > 0)
        {
            // 定义需要生成的多尺寸规格:键是尺寸标识,值是目标宽高
            var versions = new Dictionary<string, (int Width, int Height)>
            {
                { "thumbnail", (100, 100) },
                { "medium", (300, 300) },
                { "large", (800, 800) }
            };

            // 获取图片保存的根目录:wwwroot/Images
            var rootPath = Path.Combine(_hostingEnv.WebRootPath, "Images");
            // 确保目录存在,不存在则自动创建
            if (!Directory.Exists(rootPath))
            {
                Directory.CreateDirectory(rootPath);
            }

            // 获取原始文件的扩展名,统一转小写避免格式问题
            var fileExt = Path.GetExtension(file.FileName).ToLower();
            // 生成唯一文件名,防止上传同名文件覆盖
            var uniqueFileName = $"{System.Guid.NewGuid().ToString()}{fileExt}";

            // 可选:保存原始尺寸的图片
            using (var image = Image.Load(file.OpenReadStream()))
            {
                var originalPath = Path.Combine(rootPath, $"original_{uniqueFileName}");
                image.Save(originalPath);
            }

            // 遍历每个尺寸规格,生成并保存对应图片
            foreach (var version in versions)
            {
                using (var image = Image.Load(file.OpenReadStream()))
                {
                    // 按比例缩放图片,避免变形;如果需要固定尺寸裁剪,可把Mode改成ResizeMode.Crop
                    image.Mutate(x => x.Resize(new ResizeOptions
                    {
                        Size = new Size(version.Value.Width, version.Value.Height),
                        Mode = ResizeMode.Max
                    }));

                    // 构建当前尺寸的保存路径
                    var versionPath = Path.Combine(rootPath, $"{version.Key}_{uniqueFileName}");
                    // 自动识别格式保存图片
                    image.Save(versionPath);
                }
            }

            return Ok("图片上传及多尺寸生成完成");
        }
        return BadRequest("请选择要上传的图片");
    }
}

3. 关键细节说明

  • 替换旧API:ASP.NET Core里不再用Server.MapPath,而是通过IHostingEnvironment.WebRootPath获取wwwroot的物理路径,这是Core的标准做法。
  • 尺寸控制ResizeMode.Max保证图片按比例缩放,不会拉伸变形;如果需要生成固定尺寸的裁剪图(比如正方形缩略图),可以把Mode改成ResizeMode.Crop
  • 避免文件冲突:用Guid生成唯一文件名,彻底解决同名文件覆盖的问题。
  • 格式兼容:ImageSharp支持JPG、PNG、GIF等常见图片格式,保存时会自动匹配原文件格式。

4. 备选方案

如果因为某些原因不能用ImageSharp,还可以考虑SkiaSharp,这也是.NET Core兼容的图片处理库,安装包为SkiaSharp,用法和ImageSharp类似,只是API略有不同。

内容的提问来源于stack exchange,提问作者Rana Mujahid

火山引擎 最新活动