Filedownload问题Django - 文件几乎变空了

时间:2017-06-20 22:31:41

标签: django download django-class-based-views

我在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

2 个答案:

答案 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”后,即使文件方法也能正常工作。