我为Heroku使用了Django-Cookiecutter的默认设置,其中Whitenoise提供静态文件,而S3提供媒体文件。
但是,我想使用“媒体”来存储某些会随着时间而变化的较重的内容文件(pdf),而不仅仅是用户文件的上载,并且更改不需要集电性。 (最终,我将创建一个创作工具来将文件上传到S3,但目前,我只是手动将pdf等文件放置在正确的S3存储桶子目录中。)
Django-Cookiecutter的标准设置是将MEDIA_URL设置为完整的S3地址,例如Encoder
...,但是我想使用相对路径(例如,use std::any::Any;
pub struct Template {
encoder: Box<Encoder>
}
impl Template {
fn new(encoder: Box<Encoder>) -> Template{
Template {
encoder
}
}
fn encoder(&self) -> &Box<Encoder> {
&self.encoder
}
}
pub trait Encoder {
fn isEncoder(&self) -> bool {
true
}
fn as_any(&self) -> &dyn Any;
}
pub struct FixedEncoder {
length: usize
}
impl FixedEncoder {
pub fn new(length: usize) -> FixedEncoder {
FixedEncoder { length }
}
pub fn length(&self) -> usize {
self.length
}
}
impl Encoder for FixedEncoder {
fn as_any(&self) -> &dyn Any {
self
}
}
fn main() {
let fixed_encoder = FixedEncoder::new(1);
let template = Template::new(Box::new(fixed_encoder));
assert_eq!(template.encoder().isEncoder(), true); // works
let fixed_encoder_from_template : &FixedEncoder = &template.encoder().as_any().downcast_ref().unwrap();
assert_eq!(&fixed_encoder_from_template.length, &(1 as usize));
}
)访问模板中的这些文件我可以通过https://my-bucket.s3.amazonaws.com/media/some.pdf
直接浏览到静态内容。
我想要一个类似/media/some.pdf
的相对URL,因为我在href标记上使用了/static
属性,该属性应在单击时下载文件,但具有指向amazonaws.com的完全限定的url。 ,浏览器将忽略下载属性,而只是将文件加载到浏览器中。
是否有一种简单的方法来配置Django(通过/media/some.pdf
访问时,将Django配置为在White上使用Whitenoise在静态运行,而在S3上使用媒体运行)从S3返回文件?
答案 0 :(得分:1)
因此,您想在用户单击链接时在浏览器中打开“下载文件”弹出窗口吗?根据{{3}},下载属性不起作用,因为它仅适用于相同来源:
此属性仅适用于同源URL。
规范还提到Content-Disposition标头会覆盖它,因此标头是执行此操作的更可靠的方法。
您可以通过正确设置to the specs标头来设置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上托管媒体文件,由于它们的临时文件系统,它们将在下次部署时丢失,因此,将它们保存在服务器本身上是不可行的。