UnicodeDecodeError错误charmap'编解码器无法解码位置250的字节0x81:

时间:2019-03-27 07:04:53

标签: python django imagefield filefield

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

am使用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 %}

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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