Django 1.4 - django.db.models.FileField.save(filename,file,save = True)使用非ascii文件名生成错误

时间:2014-02-13 07:26:20

标签: python django unicode encoding utf-8

我正在使用Django 1.4的django.db.models.FileField制作文件上传功能

当我尝试上传名称中包含非ascii字符的文件时,会产生以下错误。

  

'ascii'编解码器无法对位置109-115中的字符进行编码:序数不是   在范围(128)

实际代码如下所示

  

file = models.FileField(_(“file”),                           MAX_LENGTH = 512,                           upload_to = os.path.join('uploaded','files','%Y','%m','%d'))

     

file.save(filename,file,save = True)#< - 此行产生错误   上面,如果'filename'包含非ascii字符

如果我尝试使用unicode(filename, 'utf-8')代替filename,则会产生

以下的错误
  

TypeError:不支持解码Unicode

如何上传名称中包含非ascii字符的文件?

我的环境信息:

  

sys.getdefaultencoding():'ascii'

     

sys.getfilesystemencoding():'UTF-8'

     

使用Django-1.4.10-py2.7.egg

2 个答案:

答案 0 :(得分:2)

您需要使用.encode()对字符串进行编码:

file.save(filename.encode('utf-8', 'ignore'), file, save=True) 

答案 1 :(得分:0)

在FileField定义中,'upload_to'参数可能类似于os.path.join(u'uploaded','files','%Y','%m','%d') (请参阅第一个u'uploaded'start with u')所以所有字符串都是unicode类型,这可能对你有帮助。