1

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

拜托,谁能帮我找到一种方法来更改 jPlayer 中的设置 - 版本:1.0.1

问候

4

2 回答 2

2

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

于 2012-01-10T06:53:57.000 回答
1

@PiotrSzmyd 是对的,它部分是硬编码的。“默认”来自Namein字段,Orchard.Web\App_Data\Sites\Default\Settings.txt路径硬编码在Orchard\FileSystems\Media\FileSystemStorageProvider.cs. 可悲的是,没有办法用处理程序或其他东西来改变这个类的行为。现在有2个选项

  1. 更改 Orchard 的源代码
  2. 通过添加一个模块来解决这个问题,该模块提供了一个自定义实现,IStorageProvider并且在需要时(意味着媒体存储路径在 Orchard 目录结构之外)一个额外的 MVC 控制器来服务媒体文件。

\\<server>\Files$\<build_configuration>\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
}

这个自定义实现映射

  • 存储路径\\<server>\Files$\<build_configuration>\Media
  • 虚拟路径~/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);
  }
}

此路由实现确保重定向www.mysite.de/Files/Default...到如下所示的特定媒体控制器:

媒体控制器

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;
}
于 2016-01-05T15:20:20.853 回答