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