Las mejores prácticas para las imágenes de una modelo con el Castillo ActiveRecord / monorraíl

StackOverflow https://stackoverflow.com/questions/1186459

Pregunta

Nuestro modelo de "usuario" necesita una pequeña imagen de perfil en él, y no estoy del todo seguro de cómo manejar la situación. Por supuesto, podríamos simplemente guardarlo en una carpeta del disco y almacenar la ruta / nombre de archivo para la base de datos, pero creo que prefiero tenerlo almacenado en la propia base de datos.

Lo primero que pensé era tener una propiedad en el modelo como este:

[Property] 
public byte[] ProfilePicture
{
  get;
  set;
}

Pero seguro que se siente como que voy a tener que ir un largo camino para conseguir que funcione de esta manera -. Obtener una matriz de bytes de la base de datos, a continuación, convirtiéndola en una imagen con algún tipo de controlador

¿Alguien ha visto un buen tutorial sobre cómo manejar este tipo de cosas? Parece que sería un requisito bastante común que me iba a encontrar algo monorraíl específica, pero hasta ahora mis búsquedas han llegado con las manos vacías.

¿Fue útil?

Solución

Sobre el almacenamiento de imágenes en la base de datos o archivos, consulte esta pregunta .

Si ha decidido almacenarlo en DB, lo más importante es que no recuperar el byte[] cada vez que se consulta para un usuario, que podría ser potencialmente una gran cantidad de datos y una Potencia del problema. Para hacer que se podía o bien almacenar la imagen en otra tabla o mapa del byte[] a otra entidad con la misma mesa (suponiendo que el usuario puede tener sólo una imagen):

[ActiveRecord("users")]
public class UserWithoutPicture {
  [PrimaryKey]
  public virtual int Id {get;set;}
...
  [BelongsTo]
  public virtual UserProfilePicture ProfilePicture {get;set;}
}

[ActiveRecord("users")]
public class UserProfilePicture {
  [PrimaryKey]
  public virtual int Id {get;set;}

  [Property]
  public virtual byte[] Image {get;set;}
}

Esto tendría algunos comportamientos cobardes aunque . Por ejemplo, para un usuario dado, el ProfilePicture nunca sería nulo. En realidad no se insertar o eliminar UserProfilePicture ya que es en realidad el usuario, en lugar usted siempre actualizar. Y que le unen a incurrir en un adicional, y hay que estar al tanto de SELECT N + 1 . Eso es justo al lado de la parte superior de mi cabeza, , no está comprobado .

Conclusión:. Almacenamiento de imágenes en otra tabla es mucho más flexible

Si quieres la conveniencia de tratar con un Image en lugar de byte[] prima, implementar IUserType . Pero recuerde que la imagen es un IDisposable, y va a ser muy duro de deshacerse de él en el momento adecuado.

La implementación de un controlador de monorraíl que devuelve una imagen es bastante sencillo ... sólo tiene que utilizar [ARFetch] para obtener el UserProfilePicture por id y escribir en la secuencia de respuesta con el tipo de contenido apropiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top