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




