我使用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")
时,可以下载该文件,但无法打开。我该如何处理这个问题?
答案 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')
希望它有所帮助。