【发布时间】:2017-11-23 15:29:16
【问题描述】:
我在 Django 产品站点的产品视图中下载文件时遇到以下问题:
问题:下载文件的文件大小实际上是 1kb,而它应该是正常的图像文件大小(在我的示例中为 20kb)。
所以要下载的文件存在于产品 instance.id 的静态文件夹中(static_cdn/protected/instance.id/image.jpg -- 上下文:用户可以将文件上传到相应产品视图的产品站点) .
但是,每当我尝试从产品视图下载它时,它都会下载具有正确文件名的文件(包括文件名前添加的 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
模型.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、文件路径和响应变量:
打印对象: pr8
打印文件路径: C:\Users\xx\xx\xx\market_place\static_cdn\protected\8\Beach.jpg
打印响应: 内容类型:应用程序/强制下载 内容处置:附件;文件名=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
【问题讨论】:
标签: django download django-class-based-views