Domanda

Il nostro modello "utente" ha bisogno di una piccola immagine del profilo su di esso, e io non sono del tutto sicuro di come gestire la cosa. Naturalmente potremmo semplicemente salvarlo in una cartella sul disco e memorizzare il percorso / nome del file al database, ma penso che avrei preferito è memorizzato nel database stesso.

Il mio primo pensiero è stato quello di avere una proprietà sul modello come questo:

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

Ma ci si sente certo, come ho intenzione di andare un lungo cammino per farlo funzionare in questo modo -. Ottenere un array di byte dal database, quindi convertirlo in un'immagine con una sorta di handler

Qualcuno ha visto un buon tutorial su come gestire questo genere di cose? Sembra che sarebbe un requisito abbastanza comune che mi piacerebbe trovare qualcosa di monorotaia specifica, ma finora le mie ricerche sono venuti a mani vuote.

È stato utile?

Soluzione

A proposito di memorizzazione delle immagini su database o file, vedere questa domanda .

Se avete deciso di memorizzarlo sul DB, la cosa più importante è che si non recuperare l'byte[] ogni volta che si esegue una query di un utente, che potrebbe essere potenzialmente un sacco di dati e di un problema perf. Per fare questo si potrebbe o salvare l'immagine in un'altra tabella o mappare il byte[] ad un altro soggetto con la stessa tabella (supponendo che l'utente può avere solo una foto):

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

Ciò avrebbe però alcuni comportamenti funky . Ad esempio, per un dato utente, il ProfilePicture sarebbe mai essere nullo. Non sarebbe davvero inserire o eliminare UserProfilePicture dal momento che è in realtà l'utente, invece si dovrebbe sempre aggiornare. E si potrebbe incorrere in un ulteriore join, e si deve essere consapevoli di SELEZIONARE N + 1 . Questo è solo la parte superiore della mia testa, completamente testato .

Conclusione:. Memorizzazione di immagini in un'altra tabella è molto più flessibile

Se si desidera che la convenienza di trattare con un Image anziché byte[] crudo, implementare IUserType . Ma ricordate che è un immagine IDisposable, e sarà molto difficile di smaltirlo in modo al momento giusto.

L'implementazione di un controller di monorotaia che restituisce un'immagine è molto semplice ... basta usare [ARFetch] per ottenere il UserProfilePicture da id e scrivere nel flusso di risposta con il contenuto-tipo appropriato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top