2017-06-20 3 views
0
私はDjangoの製品サイトでは、製品のビューからfiledownloadで次の問題が生じています

が実質的に空になります私の例では20kb)。Filedownload問題Djangoはファイル

したがって、ダウンロードするファイルは、製品instance.id(static_cdn/protected/instance.id/image.jpg - context:ユーザーが対応する製品ビューにファイルをアップロードできる製品サイト)の静的フォルダにあります。 )。

ただし、製品ビューからダウンロードしようとすると、正しいファイル名(ファイル名の前に追加されたinstance.id番号を含む)を含むファイルがダウンロードされますが、ファイルサイズはほとんどnullです。私はそれが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、ファイルパスと応答変数の下に見つけてください。

print obj: PR8

印刷ファイルパス: C:\ Users \ユーザーXX \ xxは\ xxは\ market_place \ static_cdn \

Beach.jpg

\ 8 \を保護された印刷応答: のContent-Type:アプリケーション/強制ダウンロード コンテンツの廃棄:添付ファイル、ファイル名= 8/Beach.jpg X-SENDFILE:8/Beach.jpg

JFIF C

[21/6月/ 2017年2時17分05秒] "GET/products/pr8/download/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

ありがとうございます。残念ながら、それはそのトリックをしませんでした。私は私の質問では、ファイルのダウンロード中にobj、filepath、およびresponse変数のログを追加しました。 – Gamelogic

+0

こんにちはYkh、私はそれをオープンメソッドにファイルメソッドを変更し、 "rb"などのモードを追加して作業しました。ファイルメソッドでモードを追加することもできます。 – Gamelogic

+0

大丈夫です。 – Ykh

0

私は答えを見つけたと思います。ファイルメソッドではなく、オープンメソッドを使用して、ファイルダウンロードを動作させました。このソリューションのために私はチュートリアルから逸脱していますが、少なくとも私は仕事を終えました。

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

へ:

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

だから、基本的機能にモードを追加

は、だから私は、それは次のルールを変更することにより、作業ました。モード "rb"を追加した後でもファイルメソッドですら動作します。