我正在尝试从文件系统中读取图像文件,并将其保存为Umbraco中的MediaItem
。
这是我放在一起的代码:
MemoryStream uploadFile = new MemoryStream();
using (FileStream fs = File.OpenRead(tempFilename))
{
fs.CopyTo(uploadFile);
HttpPostedFileBase memoryfile = new MemoryFile(uploadFile, mimetype, Path.GetFileName(src.Value));
IMedia mediaItem = _mediaService.CreateMedia(Path.GetFileName(src.Value), itNewsMediaParent, "Image");
mediaItem.SetValue("umbracoFile", memoryfile);
_mediaService.Save(mediaItem);
src.Value = library.NiceUrl(mediaItem.Id);
}
不幸的是,似乎Umbraco无法将文件保存在媒体文件夹中。它确实在媒体树中创建节点,它设置正确的宽度,高度和所有其余节点。但它指向/media/1001/my_file_name.jpg
。
媒体部分已包含多个图像,应使用的下一个“ID”为“1018”。另外,如果我在/media/1001
内查看,则没有my_file_name.jpg
的迹象。
我还验证了内存文件的SaveAs方法(它是一个HttpPostedFileBase)永远不会被调用。
任何人都可以帮助我并指出正确的方向来解决这个问题吗?
答案 0 :(得分:3)
为了保存媒体,我在MediaService中找到了这个方法。 但是,我认为另一种方法可能更精确
[HttpPost]
public JsonResult Upload(HttpPostedFileBase file)
{
IMedia mimage;
// Create the media item
mimage = _mediaService.CreateMedia(file.FileName, <parentId>, Constants.Conventions.MediaTypes.Image);
mimage.SetValue(Constants.Conventions.Media.File, file);
_mediaService.Save(mimage);
return Json(new { success = true});
}
答案 1 :(得分:3)
Media对象对某些对象类型传递给它的反应不同,在文件的情况下,处理HTTPPostedFile的子类中有一个覆盖,而HTTPPostedFile只在文件post事件期间创建,但是基类HttpPostedFileBase(这是Umbraco引用的内容)可以通过继承和实现,这样您就可以将文件传递给媒体服务,让Umbraco创建正确的文件路径等。
在下面的示例中,我创建了一个名为FileImportWrapper的新类,它继承自HttpPostedFilebase,然后继续覆盖所有属性并实现我的版本。
对于内容类型,我使用了此stackoverflow帖子(File extensions and MIME Types in .NET)中提供的代码示例。
请参阅下面的示例代码。
班级代码
public sealed class FileImportWrapper : HttpPostedFileBase
{
private FileInfo fileInfo;
public FileImportWrapper(string filePath)
{
this.fileInfo = new FileInfo(filePath);
}
public override int ContentLength
{
get
{
return (int)this.fileInfo.Length;
}
}
public override string ContentType
{
get
{
return MimeExtensionHelper.GetMimeType(this.fileInfo.Name);
}
}
public override string FileName
{
get
{
return this.fileInfo.FullName;
}
}
public override System.IO.Stream InputStream
{
get
{
return this.fileInfo.OpenRead();
}
}
public static class MimeExtensionHelper
{
static object locker = new object();
static object mimeMapping;
static MethodInfo getMimeMappingMethodInfo;
static MimeExtensionHelper()
{
Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");
if (mimeMappingType == null)
throw new SystemException("Couldnt find MimeMapping type");
ConstructorInfo constructorInfo = mimeMappingType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if (constructorInfo == null)
throw new SystemException("Couldnt find default constructor for MimeMapping");
mimeMapping = constructorInfo.Invoke(null);
if (mimeMapping == null)
throw new SystemException("Couldnt find MimeMapping");
getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
if (getMimeMappingMethodInfo == null)
throw new SystemException("Couldnt find GetMimeMapping method");
if (getMimeMappingMethodInfo.ReturnType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid return type");
if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid parameters");
}
public static string GetMimeType(string filename)
{
lock (locker)
return (string)getMimeMappingMethodInfo.Invoke(mimeMapping, new object[] { filename });
}
}
}
使用代码
IMedia media = ApplicationContext.Current.Services.MediaService.CreateMedia("image test 1", -1, Constants.Conventions.MediaTypes.Image);
this.mediaService.Save(media); // called it before so it creates a media id
FileImportWrapper file = new FileImportWrapper(IOHelper.MapPath("~/App_Data/image.png"));
media.SetValue(Constants.Conventions.Media.File, file);
ApplicationContext.Current.Services.MediaService.Save(media);
我希望这可以帮助你和其他有同样要求的人。