首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Umbraco / Umbraco未保存

Umbraco / Umbraco未保存
EN

Stack Overflow用户
提问于 2013-09-05 20:46:53
回答 2查看 4.6K关注 0票数 2

我正在尝试从文件系统中读取一个图像文件,并将其保存为Umbraco中的MediaItem

这是我放在一起的代码:

代码语言:javascript
复制
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树中创建了节点,它设置了正确的宽度、高度和其他所有内容。然而,它指向了/media/1001/my_file_name.jpg。media部分已经包含了几个镜像,应该使用的下一个"ID“是"1018”。此外,如果我在/media/1001内部检查,也没有my_file_name.jpg的迹象。

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

有没有人能帮我指出解决这个问题的正确方向?

EN

回答 2

Stack Overflow用户

发布于 2013-09-26 15:49:23

为了保存媒体,我用MediaService找到了这个方法。然而,我认为有可能是另一种更精致的方法

代码语言:javascript
复制
    [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});
    }
票数 3
EN

Stack Overflow用户

发布于 2014-02-18 18:21:51

对于传递给它的某些对象类型,媒体对象的反应是不同的,在文件的情况下,在子类中有一个覆盖,它处理仅在文件发布事件期间创建的HTTPPostedFile,但是基类HttpPostedFileBase (这是Umbraco引用的)可以被继承和实现,因此您可以将文件传递给媒体服务,并让Umbraco创建正确的文件路径等。

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

对于内容类型,我使用了这个stackoverflow帖子(File extensions and MIME Types in .NET)中提供的代码示例。

请参阅下面的示例代码。

类代码

代码语言:javascript
复制
    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 });
            }
        }
    }

使用代码

代码语言:javascript
复制
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);

我希望这对你和其他有同样需求的人有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18636764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档