6 Stimmen

UnicodeDecodeError beim Versuch, eine Datei über das standardmäßige dateibasierte Backend von Django zu speichern

Wenn ich versuche, eine Datei mit russischen Symbolen im Namen zur Modellinstanz über die Standardmethode instance.file_field.save hinzuzufügen, erhalte ich einen UnicodeDecodeError (ascii decoding error, not in range (128)) vom Speicher-Backend (stacktrace endete auf os.exist). Wenn ich diese Datei über das Standard-Python-Datei-öffnen/schreiben schreibe, ist alles in Ordnung. Alle Dateinamen sind in utf-8. Ich bekomme diesen Fehler nur beim Testen von Gentoo, auf meiner Ubuntu-Workstation funktioniert alles einwandfrei.

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 Stimmen

Es könnte hilfreich sein, Ihre Modelldefinition zu sehen.

0 Stimmen

Es ist die übliche Klasse Article(models.Model): ... file = models.FileField(null=True, blank=True, max_length = 300, upload_to='articles_files/%Y/%m/%d/')

0 Stimmen

Ein vollständiger Traceback wäre ebenfalls hilfreich.

4voto

Ivan Kuznetsov Punkte 101

Die Lösung ist ganz einfach:

In Revision 12659 wurde dieser Fehler behoben. http://code.djangoproject.com/ticket/11030

Die Revision 12661 hat dies jedoch rückgängig gemacht

"(In [12661]) #11030 behoben: Es wurde eine Änderung rückgängig gemacht, die davon ausging, dass die Dateisystemkodierung utf8 war, und ein Test wurde geändert, um zu demonstrieren, wie diese Annahme hochgeladene Nicht-ASCII-Dateinamen auf Systemen, die nicht utf8 als Dateisystemkodierung verwenden (insbesondere Windows), beschädigt. Vielen Dank für den Bericht an vrehak."

Alles, was ich also tun muss, ist, zu 12659 zurückzukehren.

-1voto

Daniel Roseman Punkte 565786

Ich vermute, es geht einfach darum, sicherzustellen, dass die upload_to Attribut ist Unicode:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X