带有日文名称的文件引发错误
Posted
技术标签:
【中文标题】带有日文名称的文件引发错误【英文标题】:file with Japanese name throws error 【发布时间】:2013-10-29 13:36:09 【问题描述】:class FileUpload(models.Model):
cstr = models.CharField(max_length=50)
file_nm = models.CharField(max_length=250,editable=False,verbose_name='Name')
file_type_cd = models.CharField(max_length=10,editable=False, verbose_name='Type')
file_size_val = models.CharField(max_length=25,editable=False, verbose_name='Size in MB')
file_upld_dts = models.DateTimeField(default =datetime.datetime.now() ,editable=False, verbose_name='Uploaded Date & Time')
fileupload = models.FileField(upload_to=fs,verbose_name='File to Upload')
file_title = models.CharField(max_length=250,verbose_name='Title')
fileretention = models.IntegerField(default=18,verbose_name = '# months of Retention')
def __unicode__(self):
return unicode(self.file_nm)
Traceback:
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/contrib/admin/options.py" in wrapper
366. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
89. response = view_func(request, *args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/contrib/admin/sites.py" in inner
196. return view(request, *args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapper
25. return bound_func(*args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/utils/decorators.py" in bound_func
21. return func(self, *args2, **kwargs2)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/transaction.py" in inner
209. return func(*args, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/contrib/admin/options.py" in add_view
955. self.save_model(request, new_object, form, False)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/contrib/admin/options.py" in save_model
709. obj.save()
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/base.py" in save
463. self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/base.py" in save_base
551. result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/manager.py" in _insert
203. return insert_query(self.model, objs, fields, **kwargs)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/query.py" in insert_query
1593. return query.get_compiler(using=using).execute_sql(return_id)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in execute_sql
909. for sql, params in self.as_sql():
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in as_sql
872. for obj in self.query.objs
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/fields/files.py" in pre_save
249. file.save(file.name, file, save=False)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/db/models/fields/files.py" in save
86. self.name = self.storage.save(name, content)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/core/files/storage.py" in save
44. name = self.get_available_name(name)
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/core/files/storage.py" in get_available_name
70. while self.exists(name):
File "/opt/venv/django-cmdb/lib/python2.6/site-packages/django/core/files/storage.py" in exists
230. return os.path.exists(self.path(name))
File "/usr/lib64/python2.6/genericpath.py" in exists
18. st = os.stat(path)
Exception Type: UnicodeEncodeError at /admin/allinone/fileupload/add/
Exception Value: 'ascii' codec can't encode character u'\u524d' in position 76: ordinal not in range(128)
这是我用于文件上传功能的 django 模型,当我尝试上传具有日语名称的文件时,我遇到了以下错误。
我可以上传普通文件,但非英文名称的文件会出错。
我尝试设置 LANG 变量,但仍然出现此错误。
有人可以帮忙解决这个问题吗?
【问题讨论】:
fs
(如models.FileField(upload_to=fs,verbose_name='File to Upload')
)设置为什么?
fs = FileSystemStorage(location='/tmp')
你能试着做那个u'/tmp'
吗?
manage.py shell
, 然后import sys; print sys.getfilesystemencoding()
说你的文件系统编码是什么?
@MartijnPieters 没用
【参考方案1】:
您需要正确设置您的语言环境用于 Apache;如果没有正确的语言环境,Python 会回退到使用 ASCII
作为文件名。
将LANG
环境变量设置为LANG=en_US.UTF-8
到Apache envvars
文件。在 Debian 和 Ubuntu 系统上,您可以在 /etc/apache2/envvars
中找到,在 RedHat 上,在 /etc/sysconfig/httpd
中。
添加行:
EXPORT LANG=en_US.utf8
如果您在查找 envvars
文件时遇到问题,请参阅 ServerFault 上的 this question,了解有关如何查找该文件的更多提示。
【讨论】:
你是怎么知道这些东西的? 我已经在 /etc/sysconfig/httpd 和 /etc/init.d/httpd 中设置了 LANG 变量,但我仍然没有出错 Django 调试输出显示错误的环境变量;验证LANG
是否设置在那里。创建一个调试视图,也可以验证sys.getfilesystemencoding()
。
@MartijnPieters 20 年吧?别担心,我会尽快赶上的:)
这很奇怪,当你通过视图 ANSI_X3.4-1968 得到它时,我得到以下值【参考方案2】:
也许您在默认情况下使用 LANG=C 语言环境运行 Apache,这至少在使用 mod_wsgi 运行时会中断上传名称中包含特殊字符的文件。
在 /etc/apache2/envvars 中激活 UTF-8 语言环境应该可以解决问题。
在 httpd.conf 中添加(或更改,如果它已经存在):
AddDefaultCharset utf-8
【讨论】:
在这里设置 Apache 的字符集无济于事;是 Python 从 env vars 确定语言环境,AddDefaultCharset
对此没有影响。
@MartijnPieters 开发人员正在使用 mod_wsgi 在 apache 中运行该站点。所以,我猜需要在两端添加 Charset。
mod_wsgi
仍然运行 Python 解释器(在 Apache 进程中或在单独的守护程序中)。 Python 使用 sys.getfilesystemencoding()
,它在 UNIX 上专有基于语言环境(LANG
和 LC_*
变量)。
啊!太好了。谢谢@MartijnPieters
我添加了谢谢@MartijnPieters以上是关于带有日文名称的文件引发错误的主要内容,如果未能解决你的问题,请参考以下文章
带有 $or 条件的 Mongoose findOne 方法会引发错误
带有 $or 条件的 Mongoose findOne 方法会引发错误
Gradle productFlavors 引发错误 - 无法添加任务“:assembleTest”,因为具有该名称的任务已存在