Quem sou eu

Minha foto

Formado em Computação, desenvolvedor web, interessado em tecnologia, metaleiro e um gamer inveterado.

Pesquisar

terça-feira, 11 de outubro de 2011

Forçando download de arquivos no Django

Muitas vezes, nossas classes possuem módulos que tem imagens em alta definição, ou até mesmo arquivos referente ao contexto da classe, tais como manuais em pdf, ou em outro formato qualquer.

Para algumas situações é melhor que o visitante faça download do arquivo, mesmo que o browser possua os plugins necessários para exibí-lo. Para forçar o download basta utilizar a view abaixo:


def download_view(request):
 from django.http import HttpResponse, Http404
 from os import path
 import mimetypes

 arquivo = "%s/%s" % (settings.MEDIA_ROOT, request.GET.get('filename'), ) 

 if not (path.exists(arquivo)):
  raise Http404()

 mimetype, encoding = mimetypes.guess_type(arquivo)

 if mimetype is None:
  mimetype = 'application/force-download'

 file = arquivo.split("/")[-1]

 response = HttpResponse(open(arquivo, 'r').read())
 response['Content-Type'] = mimetype
 response['Pragma'] = 'public'
 response['Expires'] = '0'
 response['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0'
 response['Content-Disposition'] = 'attachment; filename=%s' % file
 response['Content-Transfer-Encoding'] = 'binary'
 response['Content-Length'] = str(path.getsize(arquivo))
 return response


O parâmetro filename vem por get, permitindo que a mesma view seja utilizada para vários downloads de diferentes classes. O que pode ser ajustado é o caminho da definição da variável filename de acordo com a necessidade.

hasta!