Há pouco tempo atrás eu postei aqui no blog como forçar o download de arquivos com Django.
Na época eu havia testado o sistema em todos os navegadores que estavam ao meu alcance (Firefox, Iceweasel, Opera, Epiphany, IE6 e IE7) porém mesmo assim não precisou de muito tempo em ambiente de produção para me contactarem dizendo que o sistema não estava funcionando no IE7 (ué, como assim!? mas eu tinha testado isso!).
Testei novamente e então descobri que na verdade ele funcionava e não funcionava. Hm, ok… mas como assim!? Na verdade ele funcionava perfeitamente no IE7 do Windows 2003 Server, mas não funcionava em nenhum outro e eu dei o azar (ou sorte) de testar justamente nele… no Windows 2003 Server. Nos Windows com problemas (pleonasmo?) o erro que ocorria era o seguinte:
Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found. Please try again later.
Ok, um erro muito explicativo… Então vamos ao Google! Depois de muito procurar no Google sem encontrar nenhuma solução, um colega de empresa decidiu comparar os headers de uma aplicação escrita em .NET e que funcionava em qualquer IE, com os headers gerados pela minha aplicação. Chegamos a conclusão de que o problema estava no campo Vary, que aparecia nos headers do Django mas não existia no header da aplicação .NET.
A primeira idéia foi remover o campo manualmente, antes de retornar o response da página:
from django.http import HttpResponse, Http404
from os import path
import mimetypes
def index(request, file=''):
abspath = path.join('/your/absolute/path', file)
if not (file and path.exists(abspath)):
raise Http404()
mimetype, encoding = mimetypes.guess_type(abspath)
if mimetype is None:
mimetype = 'application/force-download'
response = HttpResponse(open(abspath, 'r').read())
response['Content-Disposition'] = 'attachment; filename=%s' % file
response['Content-Type'] = mimetype
response['Content-Length'] = str(path.getsize(abspath))
del response['Vary']
return response
* As linhas em negritos são as linhas que foram alteradas na solução inicial.
Mas não funcionou… O campo Vary continuava aparecendo e com o mesmo valor de antes. Lendo um pouco de documentação, descobrimos que essa diretiva não pode ser alterada diretamente no header da página e também qual era a forma correta de remover esse campo:
from django.views.decorators.cache import cache_control
from django.http import HttpResponse, Http404
from os import path
import mimetypes
@cache_control(private=True)
def index(request, file=''):
abspath = path.join('/your/absolute/path', file)
if not (file and path.exists(abspath)):
raise Http404()
mimetype, encoding = mimetypes.guess_type(abspath)
if mimetype is None:
mimetype = 'application/force-download'
response = HttpResponse(open(abspath, 'r').read())
response['Content-Disposition'] = 'attachment; filename=%s' % file
response['Content-Type'] = mimetype
response['Content-Length'] = str(path.getsize(abspath))
return response
* As linhas em negritos são as linhas que foram alteradas na solução inicial.
Ok, agora sim! Tudo funcionando direitinho e em todos os (pseudo-)navegadores!
Como eu não achei nada na internet que ligasse esse problema aos campos Vary do header, acredito que esse post possa ajudar alguém mais que esteja passando pelo menos problema! :)
UPDATE: Em alguns casos a conexão terminava antes de ter baixado todo o arquivo. Esse é um problema do servidor, e para corrigi-lo basta definir a diretiva EnableSendfile do Apache como On. Com essa configuração, também houve uma melhora significativa na taxa de download do servidor (pelo menos no meu caso).



4 Comments
Ola Arthur, o meu problema é o mesmissimo q o seu qto ao internet explorer, e alem do mais nao consigo entrar no msn,no skype e fazer download de qualquer outro programa. Por isso espero q vc me ajude, sou leiga nesse ramo de computador, gostaria q vc explicasse passo a passo o que devo fazer. Desde já agradeço.
Adriana:
Hm, o que eu descobri é que o Internet Explorer possui um bug no campo do header Vary, a minha solução foi alterar a minha aplicação para que eu pudesse contornar o defeito do navegador. Se me permite, tenho apenas duas dicas para você:
1. O Internet Explorer é o pior navegador já escrito, portanto use o Firefox.
2. O Windows é pior sistema operacional já escrito, portanto use o Linux, use o Ubuntu.
Olá pessoal estou com um pequeno problema, tenho instalado no meu pc o Internet Explore 7, mas já faz + ou - 1 semana que não consego baixar nada para minha máquina ou seja não consigo fazer nenhum tipo de Download oq poderia ser isso?? Por favor se alguém puder me ajudar ficarei muito grato, pois não quero formatar minha máquina.. Abração..
Jefferson:
Infelizmente isso é um problema bastante complicado de se resolver, uma vez que se trata de um bug do Internet Explorer 7. Portanto, a melhor dica que posso dar para você é a mesma que eu dei para a Adriana logo acima.
Use Linux para não precisar mais formatar a sua máquina. :)
2 Trackbacks/Pingbacks
[...] versão do Internet Explorer 7. A solução do problema também foi documentada e está disponível aqui. Post a comment — Trackback URI RSS 2.0 feed for these comments This entry (permalink) was [...]
Django, download e o problema no Internet Explorer 7…
Há algum tempo eu postei como forçar o download de arquivos no Django, porém a solução proposta gera um problema bem estranho em algumas versões do Internet Explorer 7. Neste post eu falo sobre o problema e, principalmente, como resolve-lo….
Post a Comment