我在Django产品网站的产品视图中遇到以下问题:
问题:下载文件的文件大小几乎是1kb,而它应该是普通的图像文件大小(在我的例子中为20kb)。
因此,下载文件存在于产品instance.id的静态文件夹中(static_cdn / protected / instance.id / image.jpg - context:产品站点,用户可以将文件上传到相应的产品视图)
但是,每当我尝试从产品视图下载它时,它会使用正确的文件名下载文件(包括在文件名之前添加的instance.id编号),但文件大小几乎为空。我认为它必须使用ProductDownloadView类。
请在下面找到相关代码:
views.py:
class ProductDownloadView(MultiSlugMixin, DetailView):
model = Product
def get(self, request, *args, **kwargs):
obj = self.get_object()
filepath = os.path.join(settings.PROTECTED_ROOT, obj.media.path)
response = HttpResponse(file(filepath), content_type="application/force-download")
response["Content-Disposition"] = "attachment;filename=%s" % (obj.media.name)
response["X-SendFile"] = str(obj.media.name)
return response
models.py
class Product(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
managers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="managers_product")
media = models.FileField(blank=True,
null=True,
upload_to=download_media_location,
storage=FileSystemStorage(location=settings.PROTECTED_ROOT))
def __unicode__(self):
return self.title
def get_absolute_url(self):
view_name = "products:detail_slug"
return reverse(view_name, kwargs={"slug": self.slug})
def get_download(self):
view_name = "products:download_slug"
url = reverse(view_name, kwargs={"slug": self.slug})
return url
请在下面找到打印的obj,文件路径和响应变量:
打印obj: PR8
打印文件路径: C:\ Users \用户XX \ XX \ XX \ market_place \ static_cdn \保护\ 8 \ Beach.jpg
打印回复: 内容类型:应用程序/强制下载 Content-Disposition:attachment; filename = 8 / Beach.jpg X-SendFile:8 / Beach.jpg
JFIF C
[21 / Jun / 2017 02:17:05]“GET / products / pr8 / download / HTTP / 1.1”200 52
答案 0 :(得分:0)
试试这个:
response = HttpResponse(content_type="image/jpeg")
response['X-Sendfile'] = obj.media.path
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(photo.image.name)
答案 1 :(得分:0)
我想我找到了答案。我使用open方法而不是文件方法使文件下载工作。由于这个解决方案,我偏离了教程,但至少我完成了工作。
所以我通过改变以下规则来实现它:
response = HttpResponse(file(filepath), content_type="application/force-download")
进入:
response = HttpResponse(open(filepath, "rb"), content_type="application/force-download")
所以基本上为这个功能添加一个模式。添加模式“rb”后,即使文件方法也能正常工作。