【发布时间】: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() 代替子字符串