2010-03-16 12 views
6

Cuando intento agregar un archivo con símbolos rusos en el nombre a la instancia del modelo a través del método predeterminado instance.file_field.save, obtengo un UnicodeDecodeError (error de decodificación ascii, no en rango (128) desde el backend de almacenamiento (stacktrace terminó en os.exist). Si escribo este archivo a través del archivo predeterminado python, abrir/escribir todo va bien. Todos los nombres de archivo en utf-8. Recibo este error solo al probar Gentoo, en mi estación de trabajo Ubuntu todo funciona bienUnicodeDecodeError al intentar guardar el archivo a través de django base de datos por defecto backend

class Article(models.Model): 
    file = models.FileField(null=True, blank=True, max_length = 300, 
          upload_to='articles_files/%Y/%m/%d/') 

Traceback: 
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/lib/python2.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    24.     return view_func(request, *args, **kwargs) 
File "/var/www/localhost/help/wiki/views.py" in edit_article 
    338.     new_article.file.save(fp, fi, save=True) 
File "/usr/lib/python2.6/site-packages/django/db/models/fields/files.py" in save 
    92.   self.name = self.storage.save(name, content) 
File "/usr/lib/python2.6/site-packages/django/core/files/storage.py" in save 
    47.   name = self.get_available_name(name) 
File "/usr/lib/python2.6/site-packages/django/core/files/storage.py" in get_available_name 
    73.   while self.exists(name): 
File "/usr/lib/python2.6/site-packages/django/core/files/storage.py" in exists 
    196.   return os.path.exists(self.path(name)) 
File "/usr/lib/python2.6/genericpath.py" in exists 
    18.   st = os.stat(path) 

Exception Type: UnicodeEncodeError at /edit/ 
Exception Value: ('ascii', u'/var/www/localhost/help/i/articles_files/2010/03/17/\u041f\u0440\u0438\u0432\u0435\u0442', 52, 58, 'ordinal not in range(128)') 
+0

Puede ser útil para ver la definición de su modelo. –

+0

Es habitual clase Article (models.Model): ... file = models.FileField (null = True, en blanco = True, max_length = 300, upload_to = 'articles_files /% A /% m /% d/') –

+0

El rastreo completo también sería útil. –

Respuesta

4

La solución es bastante simple:

En la revisión 12659 Este error fue corregido. http://code.djangoproject.com/ticket/11030

Pero la revisión 12661 revirtieron que

"(En [12661]) Corregido # 11030: cambiada de un cambio que supone la codificación del sistema de archivos fue UTF-8, y cambió una prueba para demostrar cómo esa suposición corrompido subido no -Los nombres de archivo de ASCII en sistemas que no usan utf8 como su codificación de sistema de archivos (Windows para uno, específicamente). Gracias por el informe a vrehak ".

Así que todo lo que tengo que hacer es volver a 12659

+3

De hecho, necesita establecer el entorno adecuado en Apache: http://code.djangoproject.com/ticket/11030#comment:5 –

+0

Gracias @TomaszZielinski que fue de hecho la solución correcta – Andrea

0

sospecho que es simplemente una cuestión de asegurarse de que el atributo upload_to es unicode:.

file = models.FileField(null=True, blank=True, max_length = 300, 
         upload_to=u'articles_files/%Y/%m/%d/') 
+0

Nada ha cambiado. –

Cuestiones relacionadas