Pergunta

O nosso modelo "usuário" precisa de uma pequena imagem de perfil sobre ele, e eu não sou inteiramente certo como lidar com isso. Claro que poderia apenas guardá-lo para uma pasta no disco e armazenar o caminho / nome do arquivo para o banco de dados, mas eu acho que eu prefiro tê-lo armazenado na própria DB.

Meu primeiro pensamento foi para ter uma propriedade no modelo como este:

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

Mas com certeza parece que eu vou ter que ir um longo caminho para fazê-lo funcionar desta forma -. Recebendo um array de bytes a partir do banco de dados, em seguida, convertê-lo para uma imagem com algum tipo de manipulador

Alguém viu um bom tutorial sobre como lidar com esse tipo de coisa? Parece que seria um requisito comum o suficiente para que eu encontrar algo MonoRail específica, mas até agora minhas pesquisas vêm-se vazia.

Foi útil?

Solução

Sobre o armazenamento de imagens no banco de dados ou arquivos, consulte esta questão .

Se você decidiu armazená-lo no DB, a coisa mais importante é que você não recuperar o byte[] cada vez que você consulta para um usuário, que poderia ser potencialmente uma grande quantidade de dados e um problema perf. Para fazer isso você poderia armazenar a imagem em outra tabela ou mapear a byte[] para outra entidade com a mesma tabela (assumindo que o usuário pode ter apenas uma imagem):

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

Isto tem alguns comportamentos funk embora . Por exemplo, para um determinado usuário, o ProfilePicture nunca seria nulo. Você realmente não iria inserir ou UserProfilePicture de exclusão, já que é na verdade o usuário, em vez disso você sempre atualizar. E você seria incorrer em juntar um adicional, e você tem que estar ciente de escolha dos n + 1 . Isso é apenas fora do topo da minha cabeça, completamente testado .

Conclusão:. Armazenar imagens em outra tabela é muito mais flexível

Se você quiser a conveniência de lidar com um Image em vez de byte[] cru, implementar IUserType . Mas lembre-se que a imagem é um IDisposable, e vai ser muito difícil para eliminá-lo no momento certo.

A implementação de um controlador de monotrilho que retorna uma imagem é bastante simples ... apenas uso [ARFetch] para obter o UserProfilePicture por id e gravação para o fluxo de resposta com o tipo de conteúdo apropriado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top