0

我为 Heroku 使用了 Django-Cookiecutter 的默认设置,Whitenoise 提供静态文件,S3 提供媒体文件。

但是,我想使用“媒体”来存储某些较重的内容文件(pdf),这些文件会随着时间的推移而改变,而不仅仅是用户文件上传,而且改变不应该需要收集静态文件。(最终我将创建一个创作工具来将文件上传到 S3,但目前我只是手动将一些文件(如 pdf)放在正确的 S3 存储桶子目录中。)

Django-Cookiecutter 的标准设置是将 MEDIA_URL 设置为完整的 S3 地址,例如https://my-bucket.s3.amazonaws.com/media/some.pdf... 但我想使用相对路径访问我的模板中/media/some.pdf的这些文件,就像我可以通过/static.

我想要一个相对 URL,/media/some.pdf因为我正在使用downloadhref 标记上的属性,单击该属性时应下载文件,但使用指向 amazonaws.com 的完全限定 url,浏览器将忽略下载属性并仅加载文件在浏览器中。

是否有一种简单的方法来配置 Django(在 Heroku 上运行,使用 Whitenoise 用于静态,S3 用于媒体)以在通过访问时从 S3 返回文件/media

4

1 回答 1

1

那么你想让浏览器在用户点击链接时打开一个“下载文件”弹出窗口吗?根据规范,下载属性不起作用,因为它仅适用于同源:

此属性仅适用于同源 URL。

规范还提到 Content-Disposition 标头会覆盖它,因此标头是一种更强大的方法。

您可以通过正确设置Content-Disposition标头来设置 S3。下面是一个运行示例:

<a href="https://s3.eu-west-2.amazonaws.com/test-cookie-cutter/media/cookiecutter-attachment.pdf">
  Document with header set
</a>
<br/>
<a href="https://s3.eu-west-2.amazonaws.com/test-cookie-cutter/media/cookiecutter.pdf">
  Document without header
</a>

当我上传带有标题的文件时,我在 AWS 控制台中添加了元数据标题:

Content-Disposition: attachment; filename="cookiecutter.pdf" 

您不能在 Heroku 上托管您的媒体文件,由于它们的临时文件系统,它们将在下一次部署时丢失,因此不能将它们放在服务器本身上。

于 2018-11-23T10:52:41.663 回答