【问题标题】:Adding Image MediaType programatically Umbraco 7.1以编程方式添加 Image MediaType Umbraco 7.1
【发布时间】:2014-08-07 21:48:11
【问题描述】:

我对 Umbraco 有点陌生,我不得不说我非常喜欢它。

但现在我被困在我认为简单的事情上。我创建了一个仅对我网站上的成员可见的受保护页面。会员可以一次上传多个文件的地方。这就像一个魅力。首先我为多个图像创建了上传表单,然后我创建了 SurfaceController 来处理提交。也像魅力一样工作。

我的 SurfaceController 上的 ActionResult 收到一个名为 files 的 IEnumerable<HttpPostedFileBase>,这很好。我看到我用我的表格发布的所有图像。但是问题来了。

在循环我的文件时,我尝试使用 MediaService.CreateMedia 创建一个媒体(图像类型),并给出我的文件名和父 ID 以及媒体类型(图像)。 但是当我尝试在我刚刚创建的媒体项目上设置 umbracoFile 值时,我会得到以下异常:

An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Umbraco.Core.dll

Additional information: The best overloaded method match for
   'Umbraco.Core.Models.ContentBase.SetPropertyValue(string, string)'
has some invalid arguments

我希望有人能告诉我我做错了什么。下面是我正在使用的代码

[HttpPost]
    public ActionResult UploadFiles(IEnumerable<HttpPostedFileBase> files)
    {
        bool success = false;
        //Get logged in member and look for the mediafolderID
        var member = Services.MemberService.GetByUsername(HttpContext.User.Identity.Name);
        var mediaFolderID = member.GetValue<int>("mediaFolderID");

        //Get mediafolder
        var mediaFolder = Services.MediaService.GetById(mediaFolderID);
        try
        {
            // Create a media item from each file uploaded
            foreach (var file in files)
            {
                var fileName = file.FileName; // Assumes no path information, just the file name
                var ext = fileName.Substring(fileName.LastIndexOf('.') + 1).ToLower();

                if (!UmbracoConfig.For.UmbracoSettings().Content.DisallowedUploadFiles.Contains(ext))
                {

                    var mediaType = global::Umbraco.Core.Constants.Conventions.MediaTypes.File;
                    if (UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.Contains(ext))
                    {
                        mediaType = global::Umbraco.Core.Constants.Conventions.MediaTypes.Image;
                    }
                    var f = Services.MediaService.CreateMedia(fileName, mediaFolderID, mediaType);

                    // Assumes the file.InputStream is a Stream - you may have to do some extra work here...
                    f.SetValue(global::Umbraco.Core.Constants.Conventions.Media.File,(Stream)file.InputStream); // Real magic happens here.
                    Services.MediaService.Save(f);
                }
            }
            success = true;
        }
        catch (Exception ex)
        {
            // On error show message
            ViewData["exceptionMessage"] = ex.Message;
            success = false;
        }

        // On success redirect to current page and show successmessage
        ViewData["success"] = success;
        if (success)
        {
            return RedirectToCurrentUmbracoPage();
        }

        return CurrentUmbracoPage();
    }

【问题讨论】:

  • 使用 Path.GetFileName() / Path.GetExtension() 代替子字符串

标签: c# umbraco umbraco7


【解决方案1】:

您应该只使用 HttpPostedFileBase:f.SetValue(global::Umbraco.Core.Constants.Conventions.Media.File, file);,而不是 f.SetValue(global::Umbraco.Core.Constants.Conventions.Media.File, (Stream)file.InputStream);

其他一些注意事项:

  • 检查文件是否有长度且不为空:file != null &amp;&amp; file.ContentLength &gt; 0
  • 您没有在任何地方使用您的 mediaFolder 变量,可以删除。
  • 不确定为什么需要global::Umbraco.Core,考虑添加using Umbraco.Core; 并使用Constants.Conventions.MediaTypes.Image 等。
  • 检查你是否真的需要依赖DisallowedUploadFiles - 我很确定在CreateMedia 期间检查过

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 2021-08-23
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多