Python 具有日语名称的文件引发错误

Python 具有日语名称的文件引发错误,python,django,django-models,django-templates,Python,Django,Django Models,Django Templates,这是我的django模型的文件上传功能,当一个用户试图上传一个有日本名字的文件时,我发现下面的错误 我可以上传普通的文件,但非英文名称的文件会出错 我尝试设置LANG变量,但仍然出现此错误 有人能帮你解决这个问题吗。你需要为Apache设置正确的语言环境;如果没有正确的区域设置,Python会使用ASCII作为文件名 将LANG环境变量设置为Apacheenvvars文件的LANG=en_US.UTF-8。在Debian和Ubuntu系统上,您可以在/etc/apache2/envvars中,在

这是我的django模型的文件上传功能,当一个用户试图上传一个有日本名字的文件时,我发现下面的错误

我可以上传普通的文件,但非英文名称的文件会出错

我尝试设置LANG变量,但仍然出现此错误


有人能帮你解决这个问题吗。

你需要为Apache设置正确的语言环境;如果没有正确的区域设置,Python会使用
ASCII
作为文件名

LANG
环境变量设置为Apache
envvars
文件的
LANG=en_US.UTF-8
。在Debian和Ubuntu系统上,您可以在
/etc/apache2/envvars
中,在RedHat上,在
/etc/sysconfig/httpd
中找到

添加行:

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)

如果您在查找
envvars
文件时遇到问题,请参阅ServerFault以获取有关如何查找该文件的更多提示。

可能您在默认情况下使用LANG=C语言环境运行Apache,这至少在使用mod_wsgi运行时会中断上载名称中带有特殊字符的文件

在/etc/apache2/envvars中激活UTF-8区域设置可以解决此问题

在httpd.conf中添加(或更改,如果已经存在):


什么是
fs
(如在
models.FileField(upload_-to=fs,verbose_-name='File-to-upload')
)设置为?fs=FileSystemStorage(location='/tmp')你能试着把它设置成
u'/tmp'
?以及
manage.py shell
是什么,然后
导入系统;print sys.getfilesystemencoding()
说你的文件系统编码是?@MartijnPieters不起作用你怎么知道这件事的?我在/etc/sysconfig/httpd和/etc/init.d/httpd中都设置了LANG变量,但我仍然没有退出errorDjango调试输出错误时显示环境变量;验证是否在此处设置了
LANG
。创建一个调试视图来验证
sys.getfilesystemencoding()
,也许也可以。@MartijnPieters 20年了,是吗?别担心,我很快就会赶上的:)这很奇怪,当你通过一个视图ANSI_X3.4-1968为Apache设置字符集时,我得到了下面的值;是Python根据env vars确定了区域设置,而
AddDefaultCharset
对此没有影响。@MartijnPieters开发人员正在apache中使用mod_wsgi运行该站点。因此,我想需要在两端添加字符集。
mod_wsgi
仍然运行Python解释器(在Apache进程中或在单独的守护进程中)。Python使用的是
sys.getfilesystemencoding()
,它在UNIX上完全基于区域设置(
LANG
LC.*
vars)。啊!太好了,我明白了。谢谢@MartijnPieters我补充道谢谢@MartijnPieters
EXPORT LANG=en_US.utf8
AddDefaultCharset utf-8