Les meilleures pratiques pour les images dans un modèle avec le château ActiveRecord / monorail

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

Question

Notre modèle « utilisateur » a besoin d'une petite photo de profil sur, et je ne suis pas tout à fait sûr comment le gérer. Bien sûr, nous pourrions l'enregistrer dans un dossier sur le disque et stocker le chemin / nom de fichier à la base de données, mais je pense que je préfère avoir ce stocké dans le DB lui-même.

Ma première pensée était d'avoir une propriété sur le modèle comme celui-ci:

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

Mais il se sent sûr que je vais devoir aller un long chemin pour le faire fonctionner de cette façon -. Obtenir un tableau d'octets à partir de la base de données, puis le convertir en une image avec une sorte de gestionnaire

Quelqu'un at-il vu un bon tutoriel sur la façon de gérer ce genre de chose? Il semble que ce serait une exigence assez commune que je trouve quelque chose monorail spécifique, mais jusqu'à présent, mes recherches ont mis au point vide.

Était-ce utile?

La solution

A propos de stockage d'images sur la base de données ou fichiers, consultez cette question .

Si vous avez décidé de le stocker sur DB, la chose la plus importante est que vous ne pas récupérer le byte[] chaque fois que vous rechercher un utilisateur, qui pourrait être potentiellement un grand nombre de données et un problème perf. Pour ce faire, vous pouvez soit stocker l'image dans une autre table ou la carte du byte[] à une autre entité avec la même table (en supposant que l'utilisateur ne peut avoir qu'une seule image):

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

Cela aurait des comportements géniaux quoique . Par exemple, pour un utilisateur donné, le ProfilePicture ne serait jamais nul. Vous ne seriez pas vraiment insérer ou supprimer UserProfilePicture car il est en fait l'utilisateur, au lieu vous toujours mettre à jour. Et vous engager une jointure supplémentaire, et vous devez être au courant de SELECT N + 1 . C'est juste à côté du haut de ma tête, complètement non testé .

. Conclusion: le stockage des images dans une autre table est beaucoup plus souple

Si vous voulez la commodité de faire face à un Image au lieu de byte[] cru, mettre en œuvre IUserType . Mais rappelez-vous que l'image est un IDisposable, et ce sera très difficile pour le disposer au bon moment.

La mise en œuvre d'un contrôleur de monorail qui renvoie une image est assez simple ... il suffit d'utiliser [ARFetch] pour obtenir le UserProfilePicture par id et écrire dans le flux de réponse avec le type de contenu approprié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top