Pergunta

Em breve iniciarei um projeto que requer suporte para arquivos binários grandes.Gostaria de usar Ruby on Rails para o webapp, mas estou preocupado com o suporte BLOB.Na minha experiência com outras linguagens, estruturas e bancos de dados, os BLOBs são frequentemente ignorados e, portanto, têm funcionalidades pobres, difíceis e/ou com bugs.

O RoR suporta BLOBs adequadamente?Há alguma pegadinha que surge quando você já está comprometido com o Rails?

POR FALAR NISSO:Quero usar PostgreSQL e/ou MySQL como banco de dados backend.Obviamente, o suporte BLOB no banco de dados subjacente é importante.No momento, quero evitar focar nos recursos BLOB do banco de dados;Estou mais interessado em como o próprio Rails reage.Idealmente, o Rails deveria esconder de mim os detalhes do banco de dados, e assim eu deveria ser capaz de mudar de um para o outro.Se isso é não o caso (ou seja:há algum problema em usar Rails com um banco de dados específico), então mencione isso.

ATUALIZAR:Além disso, não estou falando apenas do ActiveRecord aqui.Precisarei lidar com arquivos binários no lado HTTP (upload de arquivos de forma eficaz).Isso significa obter acesso aos cabeçalhos e fluxos HTTP apropriados via Rails.Atualizei o título e a descrição da pergunta para refletir isso.

Foi útil?

Solução

+1 para anexo_fu

Eu uso attachment_fu em um dos meus aplicativos e DEVO armazenar arquivos no banco de dados (por motivos irritantes que estão fora do escopo desta conversa).

A (única?) coisa complicada ao lidar com BLOBs que descobri é que você precisa de um caminho de código separado para enviar os dados ao usuário - você não pode simplesmente alinhar um caminho no sistema de arquivos como faria se fosse era um arquivo simples de Jane.

por exemplo.se estiver armazenando informações de avatar, você não pode simplesmente fazer:

<%= image_tag @youruser.avatar.path %>

você precisa escrever alguma lógica de wrapper e usar send_data, por exemplo.(abaixo está APENAS um exemplo com anexo_fu, na prática você precisaria SECAR isso)

send_data(@youruser.avatar.current_data, :type => @youruser.avatar.content_type, :filename => @youruser.avatar.filename, :disposition => 'inline' )

Infelizmente, até onde eu sei, attachment_fu (não tenho a versão mais recente) não faz um empacotamento inteligente para você - você mesmo precisa escrevê-lo.

P.S.Vendo sua pergunta editar - Attachment_fu lida com todas aquelas coisas irritantes que você mencionou - sobre a necessidade de saber caminhos de arquivos e toda essa porcaria - EXCETO o pequeno problema ao armazenar no banco de dados.De uma chance;é o padrão para aplicativos Rails.SE você insiste em reinventar a roda, o código-fonte de attachment_fu também deve documentar a maioria das dicas!

Outras dicas

Quanto ao streaming, você pode fazer tudo de maneira eficiente (pelo menos em termos de memória).No lado do upload, os parâmetros de arquivo nos formulários são abstraídos como objetos IO que você pode ler;no lado do download, consulte o formulário de render :text => isso leva um argumento Proc:

render :content_type => 'application/octet-stream', :text => Proc.new {
    |response, output|
    # do something that reads data and writes it to output
}

Porém, se o seu material estiver em arquivos no disco, as soluções mencionadas certamente funcionarão melhor.

Você pode usar o :binary digite sua migração do ActiveRecord e também restrinja o tamanho máximo:

class BlobTest < ActiveRecord::Migration
  def self.up
    create_table :files do |t|
      t.column :file_data, :binary, :limit => 1.megabyte
    end
  end
end

ActiveRecord expõe o conteúdo BLOB (ou CLOB) como uma Ruby String.

Acho que sua melhor aposta é o plug-in attachment_fu:http://github.com/technoweenie/attachment_fu/tree/master

ATUALIZAR:Encontrei mais algumas informações aqui http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

Dê uma olhada no plugin, x_send_file também.

"O plugin XSendFile fornece uma interface simples para enviar arquivos através do cabeçalho HTTP X-Sendfile.Isso permite que seu servidor web sirva o arquivo diretamente do disco, em vez de transmiti-lo através do seu processo Rails.Isso é mais rápido e economiza muita memória se você estiver usando o Mongrel.Nem todo servidor web suporta este cabeçalho.YMMV."

Não tenho certeza se pode ser usado com Blobs, pode ser apenas para arquivos no sistema de arquivos.Mas você provavelmente precisará de algo que não prenda o servidor web ao transmitir grandes blocos de dados.

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