UnicodeDecodeError на попытке сохранить файл через django значение по умолчанию filebased бэкенд

Когда я пытаюсь добавить файл с российскими символами на имя к образцовому экземпляру через метод экземпляра file_field.save по умолчанию, я получаю UnicodeDecodeError (ошибка декодирования ASCII, не в диапазоне (128) от бэкенда устройства хранения данных (stacktrace законченный на os.exist). Если я пишу, что этот файл через файл Python по умолчанию открывается/пишет, все идет право. Все имена файлов в utf-8. Я получаю эту ошибку только при тестировании хинду, на моей рабочей станции 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)')
6
задан Ivan Kuznetsov 17 March 2010 в 06:49
поделиться

2 ответа

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

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

Но в ревизии 12661 она была исправлена

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

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

4
ответ дан 17 December 2019 в 07:03
поделиться

Я подозреваю, что это просто вопрос обеспечения того, чтобы атрибут upload_to был юникодом:

file = models.FileField(null=True, blank=True, max_length = 300,
                        upload_to=u'articles_files/%Y/%m/%d/')
0
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: