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如何找到它的指数? Umbraco 8.0

Umbraco路由

用 Umbraco 开发网站[2]:使用 Umbraco创建一个基本站点(上)

text Umbraco 7:为用户重置密码并忘记密码实现#Umbraco

用 Umbraco 开发网站[1]:下载安装与初探