我对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();
}
答案 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