Django的request.FILES出现UnicodeDecodeError
我在视图调用中有以下代码……
def view(request):
body = u""
for filename, f in request.FILES.items():
body = body + 'Filename: ' + filename + '\n' + f.read() + '\n'
在某些情况下,我得到了
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 7470: ordinal not in range(128)
我哪里做错了?(我使用的是Django 1.1。)
谢谢。
4 个回答
4
Anurag的回答是对的。不过这里还有一个问题,就是你不能确定用户上传的文件到底是什么编码格式。为了找到正确的编码格式,可以尝试一个常见编码格式的列表,逐个检查,直到找到合适的为止:
encodings = ('windows-xxx', 'iso-yyy', 'utf-8',)
for e in encodings:
try:
data = f.read().decode(e)
break
except UnicodeDecodeError:
pass
4
你直接把 f.read() 的内容加到一个 Unicode 字符串上,但没有先解码。如果你从文件中读取的数据是 UTF-8 编码的,就用 UTF-8 解码;如果不是,就用它实际的编码方式。
先解码,然后再加到主体上,例如:
data = f.read().decode("utf-8")
body = body + 'Filename: ' + filename + '\n' + data + '\n'
7
Django有一些工具可以处理这个问题,比如smart_unicode、force_unicode和smart_str。通常情况下,你只需要用smart_unicode就可以了。
from django.utils.encoding import smart_unicode
def view(request):
body = u""
for filename, f in request.FILES.items():
body = body + 'Filename: ' + filename + '\n' + smart_unicode(f.read()) + '\n'