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 %}
答案 0 :(得分:0)
Django的HttpResponse类最适合基于文本的响应(html页面,txt文件等)。 documentation for the class constructor解释:
content应该是迭代器或字符串。如果是迭代器,则应返回字符串,并将这些字符串连接在一起以形成响应的内容。如果它不是迭代器或字符串,则在访问时将转换为字符串。
将content
转换为字符串时,可能会引发UnicodeDecodeError。如果要返回PDF文件,则文件内容为二进制数据,因此不打算转换为字符串。
您可以改用FileResponse类。它继承自StreamingHttpResponse,因此具有与HttpResponse不同的APi,但返回二进制文件(如PDF)可能会更好。