2017-06-16 82 views
2

我有這個視圖,它需要user_id和image_id。當用戶關閉鏈接時,檢查是否有圖像。如果有,那麼我希望該文件自動強制下載。如何強制使用django和aws s3點擊下載圖像

模板:

<a class="downloadBtn" :href="website + '/download-image/'+ user_id+'/'+ image_id +'/'">Download</a> 

之前,我開發它在我的本地機器,而這些代碼工作。

@api_view(['GET']) 
@permission_classes([AllowAny]) 
def download_image(request, user_id=None, image_id=None): 
    try: 
     ui = UserImage.objects.get(user=user_id, image=image_id) 
     content_type = mimetypes.guess_type(ui.image.url) 
     wrapper = FileWrapper(open(str(ui.image.file))) 
     response = HttpResponse(wrapper, content_type=content_type) 
     response['Content-Disposition'] = 'attachment; filename="image.jpeg' 
     return response 
    except UserImage.DoesNotExist: 
     ... 

但是現在我使用aws s3作爲我的靜態和媒體文件。我正在使用django-storage和boto3。我如何強制在瀏覽器中下載圖像?

@api_view(['GET']) 
@permission_classes([AllowAny]) 
def download_image(request, user_id=None, image_id=None): 
    try: 
     ui = UserImage.objects.get(user=user_id, image=image_id) 
     url = ui.image.url 
     ... 
     ... FORCE DOWNLOAD THE IMAGE 
     ... 
    except UserImage.DoesNotExist: 
     ... 
     ... ERROR, NO IMAGE AVAILABLE 
     ... 
+0

我已經做了這樣的事情,使用Apache2的xsendfile,這有幫助嗎? – Ykh

+0

@Ykh謝謝你,但我不太確定。 – Kakar

回答

0

你可以直接返回一個HttpResponse與圖像本身。

return HttpResponse(instance.image, content_type="image/jpeg") 

這將返回圖像的字節流。 Content-type標題是爲了在Postman等平臺上顯示圖像。

+0

這不會下載圖像,而是顯示爲常規html的一部分。也不是實際的圖像。 – Kakar