Python Django下载文件:UnicodeDecodeError

Python Django下载文件:UnicodeDecodeError,python,django,Python,Django,我使用Django 1.11下载文件。这是我的函数 def file_downloading(request, filename): path = settings.MEDIA_ROOT+'/' the_file_name = path+filename f_name = filename.split('/')[len(filename.split('/'))-1] wrapper = FileWrapper(open(the_file_name, "r"))

我使用Django 1.11下载文件。这是我的函数

def file_downloading(request, filename):
    path = settings.MEDIA_ROOT+'/'
    the_file_name = path+filename
    f_name = filename.split('/')[len(filename.split('/'))-1]
    wrapper = FileWrapper(open(the_file_name, "r"))
    content_type = mimetypes.guess_type(the_file_name)[0]
    response = HttpResponse(wrapper, content_type=content_type)
    response['Content-Length'] = os.path.getsize(path) 
    response['Content-Disposition'] = 'attachment; filename=%s f_name 
    return response`

但是当我试图下载.pdf文件时,我遇到了一个UnicodeDecodeError。实际上,它只在文件为.txt时才起作用。当我将包装更改为openfile_name,rb时,文件可以下载,但无法打开。如何处理此问题?

尝试向正在打开的文件添加编码,如下所示:

open(the_file_name, 'r', encoding='utf-8')

希望有帮助。

Django的HttpResponse类最适合基于文本的响应html页面、txt文件等。。报告解释说:

内容应该是迭代器或字符串。如果它是一个迭代器,它应该返回字符串,这些字符串将连接在一起形成响应的内容。如果它不是迭代器或字符串,则在访问时将转换为字符串

当内容转换为字符串时,可能会引发UnicodeDecodeError。如果要返回PDF文件,文件内容是二进制数据,因此不打算将其转换为字符串


您可以使用该类。它继承自StreamingHttpResponse,因此具有与HttpResponse不同的APi,但返回类似PDF的二进制文件可能会更好。

文件名w,try thisTry wrapper=openthe_file_name,rb,意味着删除文件包装器使用os.path.join来构造文件系统路径,而不是字符串concatation,效果更好。这样的代码更便于移植,更易于阅读。wrapper=openthe_file_name,rb It worked!谢谢utf-8“编解码器无法解码第11位的字节0x8f:无效的起始字节我忘记提供此信息…我已经尝试过这种方式…但无论如何,感谢您的帮助。我在浏览器中使用FileResponse并返回错误代码…您能给出一个具体的示例吗?