Orchardcms Orchard-设置特殊媒体文件夹

Orchardcms Orchard-设置特殊媒体文件夹,orchardcms,jplayer,Orchardcms,Jplayer,我需要将jPlayer目录设置为一个名为“/Default/MediaGallery”而不是“/MyFolder/CurrentMedia/”的文件夹 请问,有人能帮我找到一种方法来更改jPlayer-Version:1.0.1中的设置吗 “问候”看起来像名字。无法摆脱路径的“/Default”部分,因为jPlayer模块正在使用Orchard媒体功能,该功能有一个默认根文件夹,以每个租户的名字命名(这是一个多租户友好的模块)。 通过更改上面链接的文件第12行中的名称(MediaGallerie

我需要将jPlayer目录设置为一个名为“/Default/MediaGallery”而不是“/MyFolder/CurrentMedia/”的文件夹

请问,有人能帮我找到一种方法来更改jPlayer-Version:1.0.1中的设置吗

“问候”

看起来像名字。无法摆脱路径的“/Default”部分,因为jPlayer模块正在使用Orchard媒体功能,该功能有一个默认根文件夹,以每个租户的名字命名(这是一个多租户友好的模块)。
通过更改上面链接的文件第12行中的名称(MediaGalleries),您只能更改该路径的以下部分。

@PiotrSzmyd是正确的,部分是硬编码的。“默认值”来自
Orchard.Web\App\u Data\Sites\Default\Settings.txt中的
Name
字段,路径在
Orchard\FileSystems\Media\FileSystemStorageProvider.cs
中硬编码。遗憾的是,无法通过处理程序或其他方式改变此类的行为。现在有两种选择

  • 更改Orchard的源代码
  • 通过添加一个模块来解决此问题,该模块提供了
    IStorageProvider
    的自定义实现,并在需要时(意味着媒体存储路径在Orchard目录结构之外)添加一个额外的MVC控制器来为媒体文件提供服务
  • 我使用第二个选项将媒体存储路径更改为
    \\\Files$\\media

    首先,这里是
    IStorageProvider
    的基本部分:

    自定义
    IStorageProvider
    实现

    [Orchard.Environment.Extensions.OrchardSuppressDependency("Orchard.FileSystems.Media.FileSystemStorageProvider")] // adopted from AzureBlobStorageProvider.cs
    public class FileSystemStorageProvider : Orchard.FileSystems.Media.IStorageProvider
    {
      private Orchard.FileSystems.Media.FileSystemStorageProvider mFileSystemStorageProvider;
    
      public FileSystemStorageProvider(Orchard.Environment.Configuration.ShellSettings settings)
      {
        // use Orchard's default IStorageProvider for implementation
        mFileSystemStorageProvider = new Orchard.FileSystems.Media.FileSystemStorageProvider(settings);
    
        var lFileSystemStorageProviderType = mFileSystemStorageProvider.GetType();
    
        // get media storage path, e.g. from configuration file
        var lStoragePath = GetMediaStoragePath();
    
        lStoragePath = System.IO.Path.Combine(lStoragePath, settings.Name);
    
        // _storagePath is private read-only, so change it the hard way by using reflection
        lFileSystemStorageProviderType
          .GetField("_storagePath", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
          .SetValue(mFileSystemStorageProvider, lStoragePath);
    
        string lVirtualPath = "~/Files/" + settings.Name + "/";
    
        lFileSystemStorageProviderType
          .GetField("_virtualPath", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
          .SetValue(mFileSystemStorageProvider, lVirtualPath);
    
        string lPublicPath = mFileSystemStorageProvider.GetPublicUrl(null).Replace("/Media/" + settings.Name + "/", "/Files/" + settings.Name + "/");
    
        lFileSystemStorageProviderType
          .GetField("_publicPath", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
          .SetValue(mFileSystemStorageProvider, lPublicPath);
      }
    
      #region Implementation of IStorageProvider
    
        public bool FileExists(string aPath)
        {
          return mFileSystemStorageProvider.FileExists(aPath);
        } 
        ...
    
      #endregion
    }
    
    此自定义实现映射

    • \\\Files$\\媒体的存储路径
    • ~/Files/Default/
    • /Files/Default/
    现在有个问题。Orchard将媒体URL呈现为
    www.mysite.de/Files/Default…
    ,但Orchard目录结构中没有名为Files的目录。现在,自定义路线开始发挥作用

    自定义路线

    public class Routes : Orchard.Mvc.Routes.IRouteProvider
    {
      public System.Collections.Generic.IEnumerable<Orchard.Mvc.Routes.RouteDescriptor> GetRoutes()
      {
        Orchard.Mvc.Routes.RouteDescriptor[] lRoutes =
          new Orchard.Mvc.Routes.RouteDescriptor[] 
          {
            new Orchard.Mvc.Routes.RouteDescriptor()
            {
              Name = "Custom route for media files",
              Priority = 10000, 
              Route = new System.Web.Routing.Route(
                "Files/{*aRelativePath}",
                new System.Web.Routing.RouteValueDictionary() 
                { 
                  {"area", "MyModule"},
                  {"controller", "Media"},
                  {"action", "GetFile"}
                }, 
                new System.Web.Routing.RouteValueDictionary() {},
                new System.Web.Routing.RouteValueDictionary() { {"area", "MyModule"} },
                new System.Web.Mvc.MvcRouteHandler()
              )
            }
          };
    
        return lRoutes;
      }
    
      public void GetRoutes(System.Collections.Generic.ICollection<Orchard.Mvc.Routes.RouteDescriptor> arRoutes)
      {
        foreach (var lRouteDescriptor in GetRoutes())
          arRoutes.Add(lRouteDescriptor);
      }
    }
    

    哇,这是jPlayer的旧版本…我在Orchard中没有jPlayer可见的更新。如果我把Orchard CMS本身升级到一个更高的小版本,其他一些东西就不能像导航一样工作了。我希望你能以任何方式回答我的问题?嗯,在jPlayer中没有设置“媒体库文件夹”的选项。。这纯粹是果园问题。。对不起,我不能帮你做果园。
    public class MediaController
    {
      public MediaController(Orchard.FileSystems.Media.IMimeTypeProvider aMimeTypeProvider)
      {
        mMimeTypeProvider = aMimeTypeProvider;
      }
    
      public System.Web.Mvc.ActionResult GetFile(string aRelativePath)
      {
        string lMediaStoragePath, lErrorMessage;
    
        // get media storage path, e.g. from configuration file
        if (GetMediaStoragePath(out lMediaStoragePath, out lErrorMessage))
        {
          string lFilename = System.IO.Path.Combine(lMediaStoragePath, aRelativePath);
          string lMimeType = mMimeTypeProvider.GetMimeType(lFilename);
    
          return File(lFilename, lMimeType);
        }
        else
          return Content(lErrorMessage);
      }
    
      // private
        private Orchard.FileSystems.Media.IMimeTypeProvider mMimeTypeProvider;
    }