获取上传图片的宽高比(宽度和高度)

8

我希望在我的API中验证图像上传。我只想允许横向模式的照片,并且我还想检查其宽高比。以下是用于检查iFormFile是否为图像的代码:

    [HttpPost]
    public JsonResult Post(IFormFile file)
    {
        if (file.ContentType.ToLower() != "image/jpeg" &&
            file.ContentType.ToLower() != "image/jpg" &&
            file.ContentType.ToLower() != "image/png")
        {
            // not a .jpg or .png file
            return new JsonResult(new
            {
                success = false
            });
        }

        // todo: check aspect ratio for landscape mode

        return new JsonResult(new
        {
            success = true
        });
    }

自从System.Drawing.Image不再可用,我找不到一种方法将iFormFile转换为Image类型的对象,以检查其宽度和高度,以计算其纵横比。在ASP.NET Core API 2.0中,如何获得类型为iFormFile的图像的宽度和高度?

不应该渲染一个文件只是为了获取它的尺寸,而是要使用像SoftImaging这样的图像库从文件中提取尺寸。 - Dour High Arch
@DourHighArch 你不应该渲染一个文件来获取它的尺寸 - 这可能是正确的,但是仅仅为了对图像进行简单的尺寸检查就使用第三方库?- 我认为这不是正确的方法。 - Pascal
2个回答

27

由于System.Drawing.Image不再可用,我找不到将iFormFile转换为Image类型对象的方法,以检查其宽度和高度以计算其纵横比。

实际上这并不正确。微软已经发布了System.Drawing.Common作为NuGet,提供跨平台GDI+图形功能。该API应该是任何旧的System.Drawing代码的替代品:

using (var image = Image.FromStream(file.OpenReadStream()))
{
    // use image.Width and image.Height
}

2
谢谢,我不知道它被移动到了一个NuGet包中。它可以工作! - Pascal
1
Nuget包有外部依赖项: https://github.com/dotnet/dotnet-docker/blob/master/documentation/scenarios/using-system-drawing-common.md - Rune
嗯,是的,也不完全是。System.Drawing 是一个 GDI+ 图形库,因此您显然需要这些组件。该链接所解决的问题是针对运行削减版操作系统镜像的容器,因此是的,在那里您必须安装这些组件。 - Chris Pratt
1
所以我安装了这个,但是VS仍然抛出CA1416异常。 - Morgeth888
这只能在Windows上运行。我建议你使用SixLabors.ImageSharp库。 - undefined

0

我在 .net core 中遇到了类似的问题,我通过客户端解决方案解决了它。根据您的项目条件,您可以信任客户端处理并让他们完成一些工作。您可以使用几行 js 代码获取纵横比,这在所有浏览器上都受支持,然后将这些(widthheight)传递给 API:

var file = e.target.files[0];
if (/\.(jpe?g|png|gif)$/i.test(file.name)) {
    var reader = new FileReader();
    reader.addEventListener("load", function () {
        var image = new Image();
        image.src = this.result as string;
        image.addEventListener('load', function () {
            console.log(`height: ${this.height}, width: ${this.width}`);
        });
                
    }, false);
            
    reader.readAsDataURL(file);
}

API看起来像:

//POST : api/samples?width=100&height=500
[HttpPost]
public JsonResult Post(IFormFile file, int width, int height) {}

我已经测试了这个解决方案,用于多文件上传,效果很好。


如果我发送一个请求,格式为“api/samples?width=10&height=10”,并且附带的图像实际上是1000x1000呢?你的解决方案只有在我们可以信任所有传入流量并且可以访问前端源代码时才有效。 - merkithuseyin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接