Quem sou eu

Minha foto

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

Pesquisar

sexta-feira, 31 de agosto de 2012

Removendo acentos e caracteres especiais de nomes de arquivos durante o upload

Pior coisa para um programador, são nomes de arquivos com acentos, espaços e caracteres especiais. Pior que isso só os usuários malditos que insistem em continuar com esse procedimento infeliz.

Para resolver o problema de uma vez por todas, sempre que tiver um ImageField ou um FileField em seu model, utilize da seguinte maneira:
def retira_acento_upload(objeto, arquivo):
 """
 Essa função irá normalizar como um slug, o nome do arquivo que está sendo gravado e, irá gravá-lo
 em /media/uploads/APPNAME_CLASSNAME/ANO/nome_do_arquivo_normalizado.extensao
 """
 import os, datetime
 from django.template.defaultfilters import slugify
 caminho = str( '%s/%s/%s' % ( objeto._meta.app_label, objeto.__class__.__name__, datetime.datetime.now().year ) ).lower()
 nome, ext = os.path.splitext( arquivo )
 url = slugify( nome[:15] )
 return os.path.join( 'uploads', caminho, url+ext )

class SuaClasse(models.Model):
    ...
    arquivo = models.FileField(upload_to=retira_acento_upload)
    ...

Customize o return da def acima da maneira que desejar. No exemplo acima, o arquivo será enviado para uploads/<nome_da_app>/<nome_da_classe>/<ano_atual>/<nome_do_arquivo_nomalizado>.<extensão>

hasta!