上传带有unicode文件名的文件

时间:2012-05-22 00:19:31

标签: python django

我有一个带有unicode名称的文件(例如中文字符)。我得到一个UnicodeEncodeError。我正在使用带有utf8的postgres数据库和ubuntu lucid 64上的django开发服务器。我错过了什么?我执行以下操作,其中filename是models.py中文件的unicode名称:

def get_upload_path(instance,filename):
    return filename # Unicode error if filename has non latin 1 characters

class Kind (models.Model):
    style = models.ForeignKey(Style)
    kind_file = models.FileField(upload_to=get_upload_path)
来自shell的

enter image description here

2 个答案:

答案 0 :(得分:3)

我认为问题出在你的字符串格式上。在python2中,它自动在str类型(一系列字节)和unicode类型之间进行转换,类型代表unicode代码点的抽象系列。

我假设您的filename类型为unicode

"tmp/%s/%s"是一个字节字符串,因此python会尝试自动编码您的unicodestr以匹配。问题是它使用ascii编码来执行此操作,但无法保存您的数据。

return语句更改为使用temp2代替filename应该有效,因为现在您正在使用正确的类型。


对于未来,我还建议观看我在评论中链接的演示文稿,因为它提供了几种避免此类问题的策略。主要的一点是,你应该在程序之外发送数据时只使用字节。一旦您从外部世界收到字节,decode将其解码为unicode,并且当您从程序中发送数据时仅encode。您还应该在内部使用unicode字符串文字(u""而不是"")。

我还建议使用比tempN更有意义的变量名。

答案 1 :(得分:0)

Django附带了一些有用的功能,你可以在这里使用:https://docs.djangoproject.com/en/dev/ref/unicode/#conversion-functions

我认为smart_str就是你所需要的。

另一种方法是重命名用户上传的文件。