UnicodeDecodeError при попытке сохранить файл через файловый бэкэнд по умолчанию для django - PullRequest
6 голосов
/ 16 марта 2010

Когда я пытаюсь добавить файл с русскими символами в имени к экземпляру модели с помощью метода instance.file_field.save по умолчанию, я получаю UnicodeDecodeError (ошибка декодирования ascii, не в диапазоне (128)) от бэкэнда хранилища (завершена трассировка стека) на os.exist). Если я записываю этот файл через открытый и пишущий файл python по умолчанию, все идет правильно. Все имена файлов в utf-8. Я получаю эту ошибку только при тестировании Gentoo, на моей рабочей станции Ubuntu все работает нормально.

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)')

Ответы [ 2 ]

4 голосов
/ 17 марта 2010

Решение довольно простое:

В ревизии 12659 эта ошибка была исправлена. http://code.djangoproject.com/ticket/11030

Но ревизия 12661 отменила его

"(В [12661]) Исправлено # 11030: Отменено изменение, которое предполагало, что кодировка файловой системы была utf8, и изменен тест, чтобы продемонстрировать, как это предположение повредило загруженные имена файлов не ASCII в системах, которые не используют utf8 как их кодировка файловой системы (особенно Windows). Спасибо за сообщение vrehak. "

Так что все, что мне нужно сделать, это вернуться к 12659

0 голосов
/ 17 марта 2010

Я подозреваю, что нужно просто убедиться, что атрибут upload_to имеет Unicode:

file = models.FileField(null=True, blank=True, max_length = 300,
                        upload_to=u'articles_files/%Y/%m/%d/')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...