Umbraco MediaService / Umbraco MediaItem 未保存
Posted
技术标签:
【中文标题】Umbraco MediaService / Umbraco MediaItem 未保存【英文标题】:Umbraco MediaService / Umbraco MediaItem not saving 【发布时间】:2013-09-09 07:31:44 【问题描述】:我正在尝试从文件系统中读取图像文件并将其保存为 Umbraco 中的 MediaItem
。
这是我整理的代码:
MemoryStream uploadFile = new MemoryStream();
using (FileStream fs = File.OpenRead(tempFilename))
fs.CopyTo(uploadFile);
HttpPostedFileBase memoryfile = new MemoryFile(uploadFile, mimetype, Path.GetFileName(src.Value));
IMedia mediaItem = _mediaService.CreateMedia(Path.GetFileName(src.Value), itNewsMediaParent, "Image");
mediaItem.SetValue("umbracoFile", memoryfile);
_mediaService.Save(mediaItem);
src.Value = library.NiceUrl(mediaItem.Id);
不幸的是,Umbraco 似乎无法将文件保存在媒体文件夹中。它确实在媒体树中创建了节点,它设置了正确的宽度、高度以及其他所有内容。但是它指向/media/1001/my_file_name.jpg
。
媒体部分已经包含了几张图片,下一个应该使用的“ID”是“1018”。另外,如果我在/media/1001
内部查看,则没有my_file_name.jpg
的迹象。
我还验证了 memoryfile(它是一个 HttpPostedFileBase)的 SaveAs 方法永远不会被调用。
谁能帮助我并指出正确的方向来解决这个问题?
【问题讨论】:
您需要更多帮助吗? 【参考方案1】:为了保存媒体,我在 MediaService 中找到了这个方法。 但是,我认为可能还有另一种更精致的方法
[HttpPost]
public JsonResult Upload(HttpPostedFileBase file)
IMedia mimage;
// Create the media item
mimage = _mediaService.CreateMedia(file.FileName, <parentId>, Constants.Conventions.MediaTypes.Image);
mimage.SetValue(Constants.Conventions.Media.File, file);
_mediaService.Save(mimage);
return Json(new success = true);
【讨论】:
如果您没有父文件夹...因此没有父 ID,我尝试了“-1”或“null”,但无济于事?【参考方案2】:对于传递给它的某些对象类型,Media 对象的反应不同,在文件的情况下,处理 HTTPPostedFile 的子类中有一个覆盖,该覆盖仅在文件发布事件期间创建,但是基类 HttpPostedFileBase(即Umbraco 引用的内容)可以通过继承和实现,因此您可以将文件传递给媒体服务并让 Umbraco 创建正确的文件路径等。
在下面的示例中,我创建了一个名为 FileImportWrapper 的新类,它继承自 HttpPostedFilebase,然后我继续覆盖所有属性并实现我的版本。
对于内容类型,我使用了此 *** 帖子 (File extensions and MIME Types in .NET) 中提供的代码示例。
请参阅下面的示例代码。
类代码
public sealed class FileImportWrapper : HttpPostedFileBase
private FileInfo fileInfo;
public FileImportWrapper(string filePath)
this.fileInfo = new FileInfo(filePath);
public override int ContentLength
get
return (int)this.fileInfo.Length;
public override string ContentType
get
return MimeExtensionHelper.GetMimeType(this.fileInfo.Name);
public override string FileName
get
return this.fileInfo.FullName;
public override System.IO.Stream InputStream
get
return this.fileInfo.OpenRead();
public static class MimeExtensionHelper
static object locker = new object();
static object mimeMapping;
static MethodInfo getMimeMappingMethodInfo;
static MimeExtensionHelper()
Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");
if (mimeMappingType == null)
throw new SystemException("Couldnt find MimeMapping type");
ConstructorInfo constructorInfo = mimeMappingType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if (constructorInfo == null)
throw new SystemException("Couldnt find default constructor for MimeMapping");
mimeMapping = constructorInfo.Invoke(null);
if (mimeMapping == null)
throw new SystemException("Couldnt find MimeMapping");
getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
if (getMimeMappingMethodInfo == null)
throw new SystemException("Couldnt find GetMimeMapping method");
if (getMimeMappingMethodInfo.ReturnType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid return type");
if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid parameters");
public static string GetMimeType(string filename)
lock (locker)
return (string)getMimeMappingMethodInfo.Invoke(mimeMapping, new object[] filename );
使用代码
IMedia media = ApplicationContext.Current.Services.MediaService.CreateMedia("image test 1", -1, Constants.Conventions.MediaTypes.Image);
this.mediaService.Save(media); // called it before so it creates a media id
FileImportWrapper file = new FileImportWrapper(IOHelper.MapPath("~/App_Data/image.png"));
media.SetValue(Constants.Conventions.Media.File, file);
ApplicationContext.Current.Services.MediaService.Save(media);
我希望这对您和其他有相同要求的人有所帮助。
【讨论】:
以上是关于Umbraco MediaService / Umbraco MediaItem 未保存的主要内容,如果未能解决你的问题,请参考以下文章
Android Multimedia框架总结C++中MediaPlayer的C/S架构补充及MediaService介绍
用 Umbraco 开发网站[2]:使用 Umbraco创建一个基本站点(上)