2

MediaItemファイル システムから画像ファイルを読み取って、Umbraco に保存しようとしています。

これは私がまとめたコードです:

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

また、memoryfile (HttpPostedFileBase) の SaveAs メソッドが呼び出されないことも確認しました。

誰かが私を助けて、これを整理するために正しい方向に向けることができますか?

4

2 に答える 2

3

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);

これがあなたと同じ要件を持つ他の人に役立つことを願っています.

于 2014-02-18T10:21:51.490 に答える