Django下载文件:UnicodeDecodeError

时间:2017-05-29 10:39:13

标签: 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"))
    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时它才有效。当我将包装器更改为open("file_name","rb")时,可以下载该文件,但无法打开。我该如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

Django的HttpResponse类最适合基于文本的响应(html页面,txt文件等)。 documentation for the class constructor解释说:

  

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

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

您可以改用FileResponse课程。它继承自StreamingHttpResponse,因此具有与HttpResponse不同的APi,但它可能更适合返回二进制文件(如PDF)。

答案 1 :(得分:0)

尝试将编码添加到您要打开的文件中:

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

希望它有所帮助。