如何使用 django 和 aws s3 在点击时强制下载图像

Posted

技术标签:

【中文标题】如何使用 django 和 aws s3 在点击时强制下载图像【英文标题】:How to force download an image on click with django and aws s3 【发布时间】:2017-11-18 22:38:45 【问题描述】:

我有这个视图,它需要一个 user_id 和 image_id。当用户点击链接时,检查是否有图片。如果有,那么我希望文件自动强制下载。

模板:

<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-storages 和 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
        ...

【问题讨论】:

我在 apache2 中使用 xsendfile 做过类似的事情,这有帮助吗? @Ykh 谢谢,但我不太确定。 【参考方案1】:

您可以只返回带有图像本身的 HttpResponse。

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

这将返回图像的字节流。 Content-type 标头用于在 Postman 等平台中显示图像。

【讨论】:

这不会下载图像,而是显示为常规 html 的一部分。它也不是实际的图像。

以上是关于如何使用 django 和 aws s3 在点击时强制下载图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django (python) 和 s3 上传文件?

如何使用 django-storages 将图像上传到亚马逊 S3?在管理员中上传有效,但在网站表单中无效

如何将文件直接从 Django admin 上传到 Amazon S3?缓解 Heroku 应用程序错误(超时)

使用 Django 存储和 S3 在 collectstatic 上出现 MemcachedError

尝试访问管理字体文件时,Django 在 AWS S3 中托管静态文件导致 CORS 错误

Django使用S3服务