O que é uma maneira de Ruby on Rails para salvar imagens?


9

Desenvolvo no iOS e estou mudando de um back-end PHP para Ruby on Rails. O formato de intercâmbio é JSON .

Uma rápida pesquisa no Google por 'salvar imagens no Rails' tem quase todos os resultados relacionados a salvar dados de imagem como blobs no banco de dados. Posso estar enganado, mas tenho a impressão de que salvar dados de imagem em um banco de dados é um enorme desperdício de tempo e espaço (em vez de salvar um link no local do arquivo ('/img/subcat/4656.png') .

No PHP, é bastante padrão receber os dados, gerar um nome de arquivo, salvar esse arquivo no disco e atualizar o banco de dados com a localização da imagem no disco. É o mesmo para Ruby on Rails, ou há alguma funcionalidade de imagem ActiveRecord interna que eu não conheço?


11
Eu tropecei no PaperClip , que parece bem próximo do que eu quero. Ainda gostaria de receber conselhos de pessoas experientes do Rails sobre como lidar com servir e receber milhares de imagens na velocidade ideal.
usuário

11
Você sabe que a imagem terá tanto espaço no db ou no disco, certo? Por pressentimento, eu diria que o Rails armazena no banco de dados porque não depende tanto do apache quanto do PHP para lidar com o cache. Isso pode estar completamente errado.
Florian Margaine 28/09

2
Sim, acho que os dados da imagem não serão manipulados pelo local de armazenamento. Os trilhos podem ser diferentes, mas alguns membros confiáveis ​​da SO parecem se inclinar para os caminhos de arquivos no banco de dados. Além disso, acho que é conhecimento convencional que os bancos de dados são difíceis de dimensionar - portanto, armazenar toneladas de dados de imagens no banco de dados certamente não facilitará isso.
usuário

Respostas:


4

O que eu fiz no passado foi usar o PaperClip com o Amazon S3 e o CloudFront CDN para uma entrega mais rápida. O PaperClip suporta muito bem o armazenamento S3: consulte a documentação para obter as opções de configuração de armazenamento S3 .

  1. Configure uma distribuição do CloudFront para encaminhar solicitações de imagem para seu bucket do S3 e outras solicitações de ativos estáticos para o aplicativo Ruby on Rails (como alternativa, você também pode enviá-las para o S3, mas isso está fora do escopo desta pergunta).
  2. CNAME um domínio que você controla (como assets.example.com) para apontar para sua distribuição do CloudFront.
  3. Na configuração do PaperClip, defina s3_host_alias: assets.example.com. Isso fará com que os URLs gerados salvem os recursos de imagem para usar o host de distribuição do CloudFront.
  4. Na sua configuração do Ruby on Rails, você pode fazer config.action_controller.asset_host = http://assets.example.com. Os URLs de ativos do Ruby on Rails também usarão sua distribuição do CloudFront, para armazenamento em cache / entrega mais rápida.

Isso é bastante superficial, mas espero que você aponte na direção de alguns recursos úteis. Obviamente, essa é apenas uma solução, mas que funcionou para mim em uma situação em que eu estava lidando com centenas de milhares de anexos de imagens no banco de dados.

(Como uma possível etapa avançada que pode não ser necessário ou útil para o seu caso, você também pode configurar vários CNAMEs para a sua distribuição CloudFront, tais como assets0.example.come assets1.example.com. Ambos clipe s3_host_aliase action_controller.asset_hostpode então tomar lambdas que lhe permitirá deterministically (com base na ativo) gerar URLs que usam hosts diferentes, para melhor paralelização se você estiver baixando vários na mesma página, pois os navegadores limitarão o máximo de conexões simultâneas ao mesmo host.)


3

Eu tentei várias gemas, mas agora estou usando o FineUploader junto com o PaperClip

O FineUploader lida com grande parte da GUI para você, por exemplo, progresso do upload, arrastar e soltar e vários uploads de arquivos, e assim por diante. Estou usando o PaperClip porque quero armazenar as imagens nos meus servidores em vez de no S3.

O que normalmente fazemos é procurar uma solução configurável pronta para uso estável em vez de recriar coisas do zero. Com o PaperClip, armazeno as imagens e, com um StateMachine, faço conversões nas imagens e as coloco em uma categoria com base no nome do arquivo. Eu tinha a mesma pergunta que você, e essa era minha melhor solução de trabalho, é por isso que a compartilho.


2
Esta é apenas uma recomendação para um pacote externo fazer o trabalho; o OP estava pedindo o que os desenvolvedores do Ruby on Rails normalmente fazem para armazenar imagens, não uma recomendação. Embora este possa ser um exemplo de como um pacote faz isso, isso realmente não responde à pergunta.
Martijn Pieters

Verdade. O que normalmente fazemos é procurar uma solução configurável pronta para uso estável em vez de recriar coisas do zero. Com o PaperClip, armazeno as imagens e, com um StateMachine, faço conversões nas imagens e as coloco em uma categoria com base no nome do arquivo. Eu tive a mesma pergunta o OP tinha, e esta foi a minha melhor solução de trabalho, é por isso que eu compartilhá-lo ..
JeroenKnoops
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.