【问题标题】:How to get image width with Umbraco Media Service Saving Event如何使用 Umbraco 媒体服务保存事件获取图像宽度
【发布时间】:2018-08-13 14:55:54
【问题描述】:

我正在寻找一种通过 Umbraco 事件获取图像宽度的方法,以在上传之前验证图像是否符合特定的纵横比。问题是我不知道是否可以将 mediaItem 转换为 Image。到目前为止,如何获取宽度或高度是我的事件代码:

public class ImageResizer : ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        MediaService.Saving += MediaServiceSaving;
    }
    void MediaServiceSaving(IMediaService sender, SaveEventArgs<IMedia> e)
    {
        foreach (var mediaItem in e.SavedEntities)
        {
            Image img = (Image)mediaItem;
            double height = img.Height;
            double width = img.Width;
            string msg = "" + height;
            if (height / width != 1)
            {
                msg = "Ratio is not 1:1. Please make sure the width and height of your image is the same.";
                BasePage.Current.ClientTools.ShowSpeechBubble(BasePage.speechBubbleIcon.success, "Error", msg);
            }
            else
            {
                //Ducplicate image to images and thubnails of desired choice
                //Send images to database - continue normal process
            }
        }
    }
}

【问题讨论】:

    标签: c# asp.net-mvc image umbraco umbraco7


    【解决方案1】:

    相信 Umbraco 并让它努力确定它是否是图像:

    public class ImageResizer : ApplicationEventHandler
    {
            protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
            {
                MediaService.Saving += MediaServiceSaving;
            }
            void MediaServiceSaving(IMediaService sender, SaveEventArgs<IMedia> e)
            {
                foreach (var mediaItem in e.SavedEntities)
                {
                    //if it's an image, the content type will tell you.
                    if(mediaItem.ContentType.Alias == "Image")
                    {
                        var width = Convert.ToDouble(mediaItem.Properties["umbracoWidth"].Value);
                        var height = Convert.ToDouble(mediaItem.Properties["umbracoHeight"].Value);
    
                        if (height / width != 1)
                        {                        
                      //Sending a message will cancel the process, so you don't
                      //need an else (unless you want to do something else with the image of course.
                            e.Messages.Add(new EventMessage("Wrong Ratio", "Ratio is not 1:1. Please make sure the width and height of your image is the same.", EventMessageType.Error));                        
                        }                    
                    }
                }
            }
    }
    

    【讨论】:

    • 虽然这是我一直在寻找的,但我想我会尝试做一个自定义图像上传器。不过谢谢,如果我仍然使用这个解决方案,我肯定会使用你的代码
    【解决方案2】:

    你真的不能这样做。首先,IMedia 不一定是图像——它可以是任何东西(视频、pdf、zip 等)。它只是保存在 Umbraco 媒体库中的一个项目。实际上,您甚至可以说 Umbraco 媒体项目甚至不需要附加文件(如果您愿意,它也可能有多个文件)。

    此外 - 即使媒体项目实际上是图像,您也不能简单地将其转换为 .NET Image 类,因为它们实际上并不是一回事。

    您想要验证上传的图片是否符合特定比例,然后才能保存。虽然您可以在 Umbraco 中查看上传图像的比例,但这并不是在您的代码运行时始终可用的东西。保存媒体项目时,会触发您所关注的事件。

    与您的事件处理程序一起,不同的事件处理程序也附加到这个确切的事件。这个其他事件处理程序负责根据上传图像的尺寸添加umbracoWidthumbracoHeight 属性。因此,您不能真正依赖这些属性在代码运行时始终被分配和可用。您不知道这些事件运行的确切顺序,也不知道维度是否在您的代码被命中的那一刻真正持久化。

    要做你想做的事,你需要访问正在保存的文件数据,然后在内存中生成Image 并使用它来检查正在上传的图像的尺寸。

    总而言之,但我并不认为您在这里的尝试是解决此问题的最佳方法。如果有人上传多张图片,但只允许其中一半 - 您将如何处理这种情况? 仅显示通知气泡时,用户不会很清楚哪些文件是正确的,哪些不是。除此之外-您并没有真正阻止上面代码示例中的任何内容。您只是显示一个通知错误 - 但即使比例不正确,文件仍会保存。

    然后是挂钩到一般事件的问题,例如媒体服务上的Saving 事件。这用于保存任何类型的媒体 - 所以首先你需要确保你的代码只在你希望它运行的东西上运行。这意味着将其限制为仅在实际上传图像时运行。但是,您也很可能希望将其限制为仅在特定情况下发生的上传时运行(无论如何,您似乎不太可能只希望上传适合 1:1 的比例)。

    我认为解决您的问题的最佳方法是考虑为媒体库创建一个自定义图像上传编辑器,该编辑器只需直接在 javascript 中检查图像,它是否符合您的比例要求。这将确保您可以以一种很好的方式处理人们尝试输入尺寸不正确的图像的情况 - 显示警告并使 UI 状态无效,甚至在让他们尝试保存媒体项目之前。

    它也将更加灵活,因为它不会干扰在您的站点中进行的所有媒体保存 - 代码只会处理使用此特定属性编辑器的上传上传。


    我还强烈建议您花一点时间研究 ImageProcessor 和 Umbraco 中的 Image Cropper 的功能。它基本上允许您设置要包含图像的特定预设尺寸。上传图像时,您可以精确指定您希望如何裁剪/调整该图像以适应特定尺寸。然后可以在您的标记中使用这些裁剪,并且 Umbraco 将确保以您在模板中请求的特定大小调整、裁剪、缓存和输出您网站中的图像。

    您可以在此处阅读更多信息:https://our.umbraco.org/documentation/getting-started/backoffice/property-editors/built-in-property-editors/image-cropper

    【讨论】:

    • 非常感谢,这正是我无法在 Umbraco 的文档中清楚找到的解释。真的很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2015-12-29
    • 2012-01-15
    相关资源
    最近更新 更多