Umbraco 11:如何通过字节流创建媒体并获取其URL
Umbraco 11 通过字节流创建媒体并获取URL实现方案
1. 注入核心服务
Umbraco 11 基于.NET 6+,需通过构造函数注入IMediaService(媒体操作)和IMediaUrlGenerator(URL生成):
private readonly IMediaService _mediaService; private readonly IMediaUrlGenerator _mediaUrlGenerator; public YourPackageService(IMediaService mediaService, IMediaUrlGenerator mediaUrlGenerator) { _mediaService = mediaService; _mediaUrlGenerator = mediaUrlGenerator; }
2. 从字节流创建媒体
以默认图片媒体类型为例,步骤如下:
// 1. 创建媒体节点,参数依次为:文件名、父节点ID(-1表示根目录)、媒体类型别名 var media = _mediaService.CreateMedia("示例图片", -1, "Image"); // 2. 将字节流转为内存流,绑定到媒体的文件属性 using var contentStream = new MemoryStream(yourByteData); // yourByteData为目标字节数组 media.SetValue(_mediaService, "umbracoFile", "sample-image.jpg", contentStream); // 3. 保存媒体(如需发布,改用SaveAndPublish方法) _mediaService.Save(media);
提示:如果使用自定义媒体类型,需将
"Image"替换为你的类型别名,"umbracoFile"替换为对应文件属性的别名。
3. 生成媒体URL
通过IMediaUrlGenerator获取媒体文件的URL,支持相对/绝对URL转换:
// 获取相对URL var relativeUrl = _mediaUrlGenerator.GetUrl(media, "umbracoFile"); // 转为绝对URL(可选) if (relativeUrl != null) { var absoluteUrl = relativeUrl.ToAbsoluteUrl(); }
与旧版本(Umbraco 7/8)的核心差异
- 移除了
MediaService.CreateMediaWithIdentity,统一使用CreateMedia方法创建节点 - URL生成不再依赖
UmbracoHelper,改为注入IMediaUrlGenerator实现,符合.NET DI规范 - 设置媒体文件时,必须显式传入
IMediaService到SetValue方法,这是Umbraco 9+的强制要求
内容的提问来源于stack exchange,提问作者Eranga Wijethunga
相关产品推荐
相关产品推荐

