Media オブジェクトは、一部のオブジェクト タイプが渡されると異なる反応を示します。ファイルの場合、ファイル ポスト イベント中にのみ作成される HTTPPostedFile を処理する子クラスにオーバーライドがありますが、基本クラス HttpPostedFileBase (これは Umbraco が参照するものです) ) を継承して実装できるため、メディア サービスにファイルを渡したり、Umbraco に正しいファイル パスを作成させたりすることができます。
以下の例では、HttpPostedFilebase から継承する FileImportWrapper という名前の新しいクラスを作成し、次にすべてのプロパティをオーバーライドして、それらのバージョンを実装します。
コンテンツ タイプについては、このスタック オーバーフローの投稿 ( 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);
これがあなたと同じ要件を持つ他の人に役立つことを願っています.