【问题标题】:Filedownload Issue Django - File becomes practically empty文件下载问题 Django - 文件几乎变为空
【发布时间】: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


    【解决方案1】:

    我想我已经找到了答案。我通过使用 open 方法而不是 file 方法使文件下载工作。由于这个解决方案,我偏离了教程,但至少我完成了工作。

    所以我通过更改以下规则使其工作:

    response = HttpResponse(file(filepath), content_type="application/force-download") 
    

    进入:

    response = HttpResponse(open(filepath, "rb"), content_type="application/force-download") 
    

    所以基本上为函数添加了一个模式。添加模式“rb”后,即使文件方法也有效。

    【讨论】:

    • 我遇到了同样的问题。我试过xsend和sendfile。文件返回,但总是返回空。我从受保护的目录而不是媒体文件夹中提供文件。但我无法弄清楚为什么文件返回为空。经过数小时的努力,上述答案对我有用。
    【解决方案2】:

    试试这个:

    response = HttpResponse(content_type="image/jpeg")
    response['X-Sendfile'] = obj.media.path
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(photo.image.name)
    

    【讨论】:

    • 谢谢Ykh。不幸的是,这并没有奏效。我在我的问题中添加了文件下载期间打印的 obj、文件路径和响应变量的日志。
    • 嗨,Ykh,我通过将文件方法更改为打开方法并添加诸如“rb”之类的模式来使其工作。在文件方法中添加模式也可以..
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2017-12-06
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多