以编程方式添加Image MediaType Umbraco 7.1

时间:2014-08-07 21:48:11

标签: c# umbraco umbraco7

我对Umbraco有点新鲜,我不得不说我非常喜欢它。

但是现在我仍然坚持一些简单的想法。我创建了一个仅对我网站上的成员可见的受保护页面。成员能够一次上传多个文件。这就像一个魅力。首先,我为多个图像创建了上传表单,然后我创建了SurfaceController来处理提交。也像魅力一样工作。

我的SurfaceController上的ActionResult接收到IEnumerable<HttpPostedFileBase>个被调用的文件,这很好。我看到我用我的表单发布的所有图片。但问题来了。

在循环我的文件时,我尝试使用MediaService.CreateMedia创建一个Media(图像类型),给出我的文件名和parentid以及mediaType(图像)。 但是当我尝试在我刚创建的媒体项上设置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();
    }

1 个答案:

答案 0 :(得分:2)

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

其他一些说明:

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