首页 > 解决方案 > UnicodeDecodeError 错误charmap'编解码器无法解码位置 250 中的字节 0x81:

问题描述

class ProductDownloadlView(MultiSlugMixin,DetailView):
    model=Product
    def get(self,request,*args,**kwargs):
        obj=self.get_object()
        filepath = os.path.join(settings.PROTECTED_ROOT,obj.media.path)
        guessed_type = guess_type(filepath)[0]
        wrapper=FileWrapper(open(filepath))
        mimetype = 'application/force-download'
        if guessed_type:
            mimetype=guessed_type
        response = HttpResponse(wrapper,content_type=mimetype)
        if request.GET.get("preview"):
            response["Content-Disposition"]="attachment; filename=%s" %(obj.media.name)
        response["X-SendFile"]=str(obj.media.name)
        return response

我正在使用 python 3.7 和 django 1.8.6 尝试下载 .txt 之类的文件可以正常工作并且 .md 文件,但我尝试了一个图像文件,它给出了错误charmap'编解码器无法解码位置 250 的字节 0x81:字符映射到来自模板列表产品

{% extends "base.html" %}
{% block Content %}
<h1>Products</h1>
<p>{{object.title}} </p>
<p>{{object.description}} </p>
<p>{{object.price}}</p>
{% if object.media %}
<p>{{ object.media }}</p>
<p><a href="{{ object.get_download }}">Download</a></p>
<p><a href="{{ object.get_download }}?preview=True">Preview</a></p>
{% endif %}
{% endblock Content %}

标签: pythondjangoimagefieldfilefield

解决方案


Django 的 HttpResponse 类最适合基于文本的响应(html 页面、txt 文件等)。类构造函数的文档解释了:

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

content将 UnicodeDecodeError转换为字符串时,可能会引发您的 UnicodeDecodeError 。如果要返回一个PDF文件,文件内容是二进制数据,所以不打算转成字符串。

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


推荐阅读