Umbraco MediaService / Umbraco MediaItem不保存

时间:2013-09-05 12:46:53

标签: c# asp.net .net umbraco

我正在尝试从文件系统中读取图像文件,并将其保存为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的迹象。

我还验证了内存文件的SaveAs方法(它是一个HttpPostedFileBase)永远不会被调用。

任何人都可以帮助我并指出正确的方向来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

为了保存媒体,我在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});
    }

答案 1 :(得分:3)

Media对象对某些对象类型传递给它的反应不同,在文件的情况下,处理HTTPPostedFile的子类中有一个覆盖,而HTTPPostedFile只在文件post事件期间创建,但是基类HttpPostedFileBase(这是Umbraco引用的内容)可以通过继承和实现,这样您就可以将文件传递给媒体服务,让Umbraco创建正确的文件路径等。

在下面的示例中,我创建了一个名为FileImportWrapper的新类,它继承自HttpPostedFilebase,然后继续覆盖所有属性并实现我的版本。

对于内容类型,我使用了此stackoverflow帖子(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);

我希望这可以帮助你和其他有同样要求的人。