UnicodeDecodeError Ошибка charmap 'кодек не может декодировать байт 0x81 в позиции 250: - PullRequest
0 голосов
/ 27 марта 2019

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'кодек не может декодировать байт 0x81 в позиции 250: символы отображаются в списке шаблонов продуктов

{% 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 голосов
/ 27 марта 2019

Класс Django HttpResponse наиболее подходит для текстового ответа (HTML-страница, текстовый файл и т. Д.). документация для конструктора класса объясняет:

содержимое должно быть итератором или строкой. Если это итератор, он должен возвращать строки, и эти строки будут объединены вместе, чтобы сформировать содержимое ответа. Если это не итератор или строка, при обращении к ней она будет преобразована в строку.

Вы UnicodeDecodeError, вероятно, возникает, когда content преобразуется в строку. Если вы хотите вернуть файл PDF, содержимое файла представляет собой двоичные данные, поэтому оно не предназначено для преобразования в строку.

Вместо этого вы можете использовать FileResponse класс. Он наследуется от StreamingHttpResponse и поэтому имеет другой APi, чем HttpResponse, но, вероятно, будет лучше возвращать двоичный файл (например, PDF).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...