Arquivos da Categoria: desenvolvimento

Há bastante tempo eu (lonefreak) e krateria temos batido cabeça tentando entender porque uma aplicação em Rails, que rodava tranquila com Mongrels estava com problemas de lentidão no Apache (em ambos os casos dentro de um FreeBSD. Hoje, enfim, encontramos a solução.

Ao que parece, todo o problema residia na forma como o FastCGI, módulo utilizado pelo Apache, estava tendo problemas para iniciar uma instância do módulo, estivesse ele em modo Dynamic, Static ou External. Depois de fuchar e mexer um bocado, acabamos topando com este tutorial, realmente muito útil e que sugere a utilização de outro módulo, o fcgid. E não é que funcionou mesmo?

E foi relativamente simples de resolver. Leve em consideração que já tínhamos aqui um ambiente estável rodando Rails no Apache, com FastCGI, apenas muito lento. Então as mudanças não foram tantas. Instalamos o pacote do fcgid pelo ports e não pelo gem (o que por si só pode salvar você de muita dor de cabeça) e usamos a biblioteca fcgi_handler, ao invés da fcgi (com ou sem rubygems), como indicado no tutorial.

O fcgid não foi muito comentado e há pouca documentação disponível, mas pareceu muito mais robusto e estável que o FastCGI. Além disso, nos livrou do problema de tentar o Rails com o LigHTTPD.

See ya

Forçar o download de um arquivo numa aplicação rails, ao invés de deixar o conteúdo ser carregado no navegador é bastante simples.

Tenho visto em vários fóruns uma centena de workarounds utilizando headers bem conhecidos, ou então um header um pouco mais obscuro, que a princípio daria mais velocidade e segurança ao download, mas que só funciona se você roda sua aplicação no Apache ou no Lighttpd, pois usa o mod_xsendfile.

Contudo, o próprio rails possui um método para lidar facilmente com isso, o send_file.

Neste caso eu mantive o caminho e mimetype da imagem em banco de dados após fazer o upload dela. Cobrirei o tópico upload em outro post mais pra frente. Assim, para utilizar o send_file, basta colocar em seu controller:



class MyController < ApplicationController
def downloadFile
# encontra os dados do arquivo procurado através de seu id
@file = myFile.find(params[:id])
# pega o nome do arquivo
filename = #{File.basename(@file.path)}
# pega o mimetype do arquivo
mimetype = @file.mimetype
# veja que o parâmetro disposition está com o valor attachment
send_file "#{RAILS_ROOT}/caminho/do/arquivo/" + filename,
:type => mimetype,
:disposition => 'attachment'
end
# outros métodos de sua classe controller
(...)
end

Com isso, o navegador não é redirecionado para outra página, removendo a necessidade de utilizar headers e o arquivo é enviado para download, já com mimetype reconhecido.

See ya