Django的request.FILES出现UnicodeDecodeError

7 投票
4 回答
4609 浏览
提问于 2025-04-15 15:48

我在视图调用中有以下代码……

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'

撰写回答