Pregunta

Necesito configurar el directorio JPlayer en una carpeta que no se llama "/default/mediaGallery" sino "/myfolder/currentMedia/".

Por favor, ¿alguien puede ayudarme a encontrar una manera de cambiar la configuración en JPlayer - Versión: 1.0.1

Saludos

¿Fue útil?

Solución

Parece el nombre está codificado. No hay forma de deshacerse del "/Defecto" Parte de la ruta, ya que el módulo JPlayer está utilizando la función Orchard Media, que tiene una carpeta raíz predeterminada que lleva el nombre de cada uno de los inquilinos (es un módulo amigable con el múltiplo). Puede alterar solo la siguiente parte de esa ruta cambiando el nombre (Mediagalleries) en la línea 12 del archivo vinculado anteriormente.

Otros consejos

@Piotrszmyd tiene razón, es en parte codificada. El "predeterminado" proviene del campo Name en Orchard.Web\App_Data\Sites\Default\Settings.txt y los caminos están codificados en Orchard\FileSystems\Media\FileSystemStorageProvider.cs. Lamentablemente, no hay forma de cambiar el comportamiento de esta clase con manejadores o algo así. Hay 2 opciones ahora

  1. Cambiar el código fuente de Orchard
  2. Trabajar a su alrededor agregando un módulo que proporcione una implementación personalizada de IStorageProvider y cuando sea necesario (significa que la ruta de almacenamiento de medios está fuera de la estructura del directorio del huerto) un controlador MVC adicional para servir a los archivos multimedia.

Cambié la ruta de almacenamiento de medios a \\<server>\Files$\<build_configuration>\Media mediante el uso de la segunda opción.

Primero, aquí están las partes esenciales del IStorageProvider:

Disfraz IStorageProvider implementación

[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
}

Este mapas de implementación personalizados

  • ruta de almacenamiento a \\<server>\Files$\<build_configuration>\Media
  • camino virtual a ~/Files/Default/
  • camino absoluto a /Files/Default/

Hay un problema ahora. Orchard haría que las URL de los medios sean como www.mysite.de/Files/Default... Pero no se llaman archivos de directorio en la estructura del directorio Orchard. Ahora la ruta personalizada entra en juego.

Ruta personalizada

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

Esta implementación de la ruta garantiza una redirección de www.mysite.de/Files/Default... a un controlador de medios específico que se ve así:

Controlador de medios

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top