2017-06-20 20 views
0

我有在Django的產品網站產品的意見filedownload了以下問題:Filedownload問題的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:\用戶\ XX \ XX \ XX \ market_place \ static_cdn \保護\ 8 \ Beach.jpg

打印響應: 內容類型:應用程序/力下載 內容處置:附件;文件名= 8/Beach.jpg X-SENDFILE:8/Beach.jpg

JFIFç

[21 /月/ 2017年2點17分05秒] 「GET /產品/ PR8 /下載/ HTTP/1.1」 200 52

回答

0

試試這個:

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

感謝YKH。不幸的是,這並沒有成功。在我的問題中,我在文件下載過程中添加了打印的obj,文件路徑和響應變量的日誌。 – Gamelogic

+0

嗨YKH,我把它通過改變文件的方法爲公開方法和添加模式,如「RB」工作。在文件的方法添加模式也適用.. – Gamelogic

+0

OK,這是偉大的。 – Ykh

0

我想我已經找到了答案。我通過使用open方法而不是文件方法來使文件下載工作。由於這個解決方案,我偏離了教程,但至少我完成了這項工作。

所以我得到它的工作通過改變以下規則:

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

到:

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

所以基本上增加了模式切換至功能。即使文件方法在添加模式「rb」之後仍然有效。