python - 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 %}
解决方案
Django 的 HttpResponse 类最适合基于文本的响应(html 页面、txt 文件等)。类构造函数的文档解释了:
content 应该是一个迭代器或一个字符串。如果它是一个迭代器,它应该返回字符串,这些字符串将连接在一起形成响应的内容。如果它不是迭代器或字符串,则在访问时将转换为字符串。
content
将 UnicodeDecodeError转换为字符串时,可能会引发您的 UnicodeDecodeError 。如果要返回一个PDF文件,文件内容是二进制数据,所以不打算转成字符串。
您可以改用FileResponse类。它继承自 StreamingHttpResponse,因此具有与 HttpResponse 不同的 APi,但返回二进制文件(如 PDF)可能会更好。
推荐阅读
- flutter - 有没有办法在一个容器中包含多个孩子?
- silverstripe - Silverstripe 4 silvershop-core paypal-expr. 税费和运费
- android - 使用此命令在移动设备中运行离子应用程序时出错(离子科尔多瓦运行安卓)
- android - Android 导航组件 - 在包含的模块图之间导航
- android - 在 android ExoPlayer 中添加用于播放加密 .m3u8 流的参数
- netbeans - Netbeans.conf:用户主页的变量是什么?
- javascript - 用户选择:没有在 Safari 中表现不同
- r - 如何使用带有复选框事件 Shiny 的 observeEvent
- javascript - 当我在 html 和 css 中向下滚动时,如何使图像位于菜单栏后面?
- reactjs - 为 React+Firebase 项目分离测试/生产环境的最佳方法