我有三个与paperclip和AWS S3相关的问题。
1)在我的带有回形针的模型中,我有以下代码:
has_attached_file :attachment,
:url => "/songs/:user_id/:basename.:extension",
:path => "/songs/:user_id/:basename.:extension"
URL和PATH之间的区别是什么?
2)什么是:basename.:extension
?
3)我们假设有两种模式:User
和File
。 User
有很多File
。回形针路径和网址在File
模型中配置。
在config/initializers/paperclip.rb
中,我将代码放在下面:
Paperclip.interpolates :user_id do |attachment, style|
attachment.instance.criteria.user_id
end
我确认上面的代码工作正常。我的文件保存在songs/5/song.mp3
。我想将mp3文件保存在songs/user_id_5/song.mp3
。我试过在下面做,但它不起作用。
Paperclip.interpolates :user_id do |attachment, style|
'user_id_' + attachment.instance.criteria.user_id
end
我如何按照自己的意愿制作?
答案 0 :(得分:0)
path
是您项目的关键,url
是您的s3端点来自docs
url:S3网址有四个选项。您可以选择将存储桶的名称放置为域样式(bucket.s3.amazonaws.com)或 路径式(s3.amazonaws.com/bucket)。您还可以指定CNAME (需要将CNAME指定为:s3_alias_url。您可以 阅读更多关于CNAME和S3的信息 docs.amazonwebservices.com/AmazonS3/latest/index.html?VirtualHosting.html 通常情况下,这无关紧要,你可以离开 default(路径样式或:s3_path_url)。但在某些情况下 路径不起作用,您需要使用域样式 (:s3_domain_url)。此处的任何其他内容都将被视为路径风格。
路径:这是存储文件的存储区下的密钥。 URL将从存储桶和路径构造。这是您想要插入的内容。键应该是唯一的,比如文件名,尽管S3(严格来说)不支持目录,但您仍然可以使用/来分隔文件名的部分。
您可以在配置中配置bucket
或url
,并在调用方法时传递path
(即存储文件的位置)
config.paperclip_defaults = {
storage: :s3,
s3_credentials: {
bucket: 'mybucket'),
access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
s3_region: 'aws_region_id',
}
}
我不知道
您需要字符串插值
Paperclip.interpolates :user_id do |attachment, style|
"user_id_#{attachment.instance.criteria.user_id}"
end