Django es el entorno de desarrollo web para perfeccionistas con límites de tiempo

Renombrar nombres de archivos a ASCII

Los archivos que suben los usuarios a veces tienen nombres con caracteres no ASCII. Hoy en día casí todos los sistemas de archivos permiten encoding UTF-8, pero a veces nos podemos encontrar problemas en sistemas que no tienen UTF-8 activado o al ejecutar scripts sobre los ficheros que esperen un nombre de archivo en ASCII.

Bojan Mihelac ha publicado en su blog una clase de almacenamiento que se basa en el FileSystemStorage original añadiéndole la normalización de nombres de archivo a ASCII antes de ser almacenados.

A continuación tenéis el código de ASCIIFileSystemStorage. Para convertir a ASCII los nombres de los archivos que se suban bastará con guardar el código e incluir la clase en el setting DEFAULT_FILE_STORAGE:

import unicodedata

from django.core.files.storage import FileSystemStorage

class ASCIIFileSystemStorage(FileSystemStorage):
    """
    Convert unicode characters in name to ASCII characters.
    """
    def get_valid_name(self, name):
        name = unicodedata.normalize('NFKD', name).encode('ascii', 'ignore')
        return super(ASCIIFileSystemStorage, self).get_valid_name(name)

Publicado por Antonio Melé el Miércoles 16 d Febrero d 2011 Compártelo: Facebook: Twitter: | Categorías: trucos

Entradas similares

Subdominios con Django

En ocasiones nos interesa trabajar con subdominios en nuestros proyectos Django. Para ello podemos utilizar un sencillo middleware para subdominios que podemos encontrar en ...


Métodos para crear perfiles de usuario

En múltiples ocasiones nos gustaría extender el modelo User para que incluyera otros campos y funciones. La manera "oficial" de hacer esto (la mostrada ...


 
Settings accesibles desde las plantillas

Muchas veces deseamos acceder a los settings de nuestro proyecto desde alguna de nuestras plantillas. Lo ideal es crear un context processor que nos ...


Descubriendo objetos similares por sus etiquetas 2

Ya hablamos anteriormente sobre cómo descubrir objetos similares por sus etiquetas con la versión 1.0 de Django. Sin embargo la versión de desarrollo ...


 
 

2 comentarios:

El Miércoles 16 de Febrero de 2011 Javier dijo:
En general, creo que en lugar de normalizar data externa, mucho mejor es encapsularla como lo que es: data del usuario. En el caso de nombres de files, simplemente guardo el nombre original en la base de datos, y guardo el file usando un número (típicamente el ID del registro). Algo asi: filepath='/my_datastore_dir/%d/%d/blob_%d' % (id%100, (id/100)%100, id) o algo similar
El Miércoles 16 de Febrero de 2011 Antonio Melé dijo:
@javier me parece otra buena opción la que comentas.

Escribe un comentario:

captcha