【问题标题】:UnicodeDecodeError Error charmap' codec can't decode byte 0x81 in position 250:UnicodeDecodeError 错误charmap'编解码器无法解码位置 250 中的字节 0x81:
【发布时间】:2019-03-27 07:04:53
【问题描述】:

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 %}

【问题讨论】:

    标签: python django imagefield filefield


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你能建议在哪里编辑吗,因为我要返回的应该是 jpg 文件或只是我上传的文件格式
    • 我认为你应该返回 FileRespone 而不是 HttpResponse。 programcreek.com/python/example/86007/django.http.FileResponse
    • 是的,我当然用过 wrapper=FileWrapper(open(filepath,'rb'))
    • 也 response = FileResponse(wrapper,content_type=mimetype) 工作我什至不知道这两个选项在做什么
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2019-10-20
    • 2017-02-06
    • 2021-05-06
    • 2021-04-11
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多