C# 以编程方式添加图像媒体类型Umbraco 7.1

C# 以编程方式添加图像媒体类型Umbraco 7.1,c#,umbraco,umbraco7,C#,Umbraco,Umbraco7,我对翁布拉科有点陌生,我不得不说我非常喜欢它 但现在我被一些简单的事情困住了。我创建了一个仅对我网站上的成员可见的受保护页面。成员可以一次上载多个文件。这是艾尔的魅力所在。首先,我为多个图像创建了上载表单,然后创建了SurfaceController来处理提交。也很有魅力 我的SurfaceControl上的ActionResult收到一个名为“文件”的IEnumerable,这很好。我看到了我在表单中发布的所有图像。但问题来了 在文件上循环时,我尝试使用MediaService.CreateM

我对翁布拉科有点陌生,我不得不说我非常喜欢它

但现在我被一些简单的事情困住了。我创建了一个仅对我网站上的成员可见的受保护页面。成员可以一次上载多个文件。这是艾尔的魅力所在。首先,我为多个图像创建了上载表单,然后创建了SurfaceController来处理提交。也很有魅力

我的SurfaceControl上的ActionResult收到一个名为“文件”的
IEnumerable
,这很好。我看到了我在表单中发布的所有图像。但问题来了

在文件上循环时,我尝试使用MediaService.CreateMedia创建一个媒体(图像类型),给出我的文件名和parentid以及媒体类型(图像)。 但当我尝试在刚创建的媒体项上设置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();
    }
[HttpPost]
公共操作结果上载文件(IEnumerable文件)
{
布尔成功=假;
//登录成员并查找mediafolderID
var member=Services.MemberService.GetByUsername(HttpContext.User.Identity.Name);
var mediaFolderID=member.GetValue(“mediaFolderID”);
//获取mediafolder
var mediaFolder=Services.MediaService.GetById(mediaFolderID);
尝试
{
//从上载的每个文件创建媒体项
foreach(文件中的var文件)
{
var fileName=file.fileName;//假定没有路径信息,只有文件名
var ext=fileName.Substring(fileName.LastIndexOf('.')+1.ToLower();
如果(!umbraconfig.For.umbraconsettings().Content.DisallowedUploadFiles.Contains(ext))
{
var mediaType=global::Umbraco.Core.Constants.Conventions.MediaTypes.File;
if(UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.Contains(ext))
{
mediaType=全局::Umbraco.Core.Constants.Conventions.MediaTypes.Image;
}
var f=Services.MediaService.CreateMedia(文件名,mediaFolderID,mediaType);
//假设file.InputStream是一个流-您可能需要在这里做一些额外的工作。。。
f、 SetValue(global::Umbraco.Core.Constants.Conventions.Media.File,(Stream)File.InputStream);//这里发生了真正的奇迹。
Services.MediaService.Save(f);
}
}
成功=真实;
}
捕获(例外情况除外)
{
//关于错误显示消息
ViewData[“exceptionMessage”]=示例消息;
成功=错误;
}
//成功时重定向到当前页面并显示成功消息
ViewData[“成功”]=成功;
如果(成功)
{
返回重定向到当前umbracope();
}
返回当前页面();
}

而不是
f.SetValue(全局::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::UMPLOR.Cype ,考虑使用UMPLOR.Cype添加<代码>;<编码>并使用常量、约定、媒体类型、图像等
  • 检查您是否确实需要依赖
    不允许上载的文件
    ——我很确定在
    CreateMedia
使用Path.GetFileName()/Path.GetExtension()而不是子字符串