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

在Razor .NET Core C#网站中能否通过MVC控制器/视图使用System.Drawing?

问题分析与解决方案

为什么System.Drawing在.NET Core Razor应用中无法正常工作

  • System.Drawing依赖Windows桌面的GDI+技术,而.NET Core是跨平台框架,官方明确不建议在服务器端使用System.Drawing,存在内存泄漏、跨平台兼容性差等问题。
  • 即便在Windows环境下,ASP.NET Core应用的服务器运行环境(如IIS)可能缺少GDI+操作权限,导致图像处理失败。

替代方案:使用.NET Core友好的图像处理库

推荐使用以下成熟开源库替代System.Drawing,完美适配.NET Core:

  • ImageSharp:纯C#编写,跨平台支持完善,API设计接近System.Drawing,上手成本低。
  • SkiaSharp:Google Skia图形库的.NET绑定,性能优异,适合复杂图像处理场景。

以下以ImageSharp为例,修改你的上传代码实现图片处理功能:

步骤1:安装ImageSharp包

在NuGet包管理器执行安装命令:

Install-Package SixLabors.ImageSharp

步骤2:修改PageModel代码

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats.Jpeg;

namespace DaBamba.Pages.YourDances
{
    public class UploadFileModel : PageModel
    {
        private readonly IWebHostEnvironment _environment;
        public UploadFileModel(IWebHostEnvironment environment)
        {
            _environment = environment;
        }
        [BindProperty]
        public IFormFile Upload { get; set; }
        public async Task OnPostAsync()
        {
            // 通过环境变量获取wwwroot路径,避免硬编码
            var uploadDir = Path.Combine(_environment.WebRootPath, "images", "DanceImages");
            // 确保存储目录存在
            if (!Directory.Exists(uploadDir))
            {
                Directory.CreateDirectory(uploadDir);
            }
            var savePath = Path.Combine(uploadDir, Upload.FileName);

            // 使用ImageSharp读取并处理图片
            using var image = await Image.LoadAsync(Upload.OpenReadStream());
            // 缩放图片至宽度800px,自动保持宽高比
            image.Mutate(x => x.Resize(new ResizeOptions
            {
                Size = new Size(800, 0),
                Mode = ResizeMode.Max
            }));
            // 保存处理后的图片,以JPEG格式为例,可根据原文件调整编码
            await image.SaveAsync(savePath, new JpegEncoder { Quality = 85 });
        }
    }
}

代码说明

  • 用IWebHostEnvironment.WebRootPath替代硬编码路径,符合ASP.NET Core最佳实践。
  • 通过Image.LoadAsync直接读取上传文件流,无需转换为System.Drawing.Image。
  • Mutate方法支持链式调用,可扩展添加裁剪、水印等更多图像处理操作。
  • 保存时可指定编码器参数(如JPEG质量),平衡图片大小与清晰度。

额外优化建议

  • 添加文件验证:限制仅允许上传jpg、png、webp等图片格式,拦截恶意文件。
  • 处理文件重名:生成唯一文件名(如GUID+原扩展名),避免覆盖已有文件。
  • 异常处理:添加try-catch块捕获文件读写、图像处理过程中的异常,返回友好提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:22:39