我在使用活动存储时遇到问题。当我上传到亚马逊S3时,它不会将存储桶中的文件保存为原始名称(如myfile.zip
),而是将其保存为与该文件关联的key
。所以在Cyberduck中,我看到了类似这样的东西:5YE1aJQuFYyWNr6BSHxhQ48t
。不带任何文件扩展名。
我不确定Rails5中是否有一些设置,或者它是否在亚马逊S3中,但我花了几个小时在谷歌上搜索,以找出为什么会发生这种情况。
如果有任何建议,我们将不胜感激!
致以最好的问候,安德鲁
发布于 2018-06-02 02:48:38
这是经过设计的,来自ActiveStorage。文件按其键存储,并且在S3上没有扩展名,但是当ActiveStorage生成URL时,disposition and filename are set。
def url(key, expires_in:, filename:, disposition:, content_type:)
instrument :url, key: key do |payload|
generated_url = object_for(key).presigned_url :get, expires_in: expires_in.to_i,
response_content_disposition: content_disposition_with(type: disposition, filename: filename),
response_content_type: content_type
payload[:url] = generated_url
generated_url
end
结束
这样做可能是为了避免在其他情况下遇到的文件名转义问题。
您可以阅读有关Content-Disposition
headers here的更多信息。
发布于 2018-09-03 12:27:41
您仍然可以使用filename accessor引用该名称。
class User < ApplicationRecord
has_one_attached :photo
...
end
filename = User.first.photo.filename
发布于 2020-01-24 17:53:53
为了在S3上有一个自定义文件名,您应该同时更新blob.key
和S3上的名称。
活动存储使用blob.key
作为远程映像路径和名称,将映像上传到S3上。
对于我的用法,我只用一个猴子补丁更改了“图像变体”的名称,它允许生成一个以filename
终止的key
:
config/initializers/active_storate_variant.rb
:
ActiveStorage::Variant.class_eval do
def key
"variants/#{blob.key}/#{Digest::SHA256.hexdigest(variation.key)}/#{filename}"
end
end
因此,当我需要图像变量的公共url时,我只需调用image.url('400x400')
下面是我的Image模型的定制方式:
class Image < ApplicationRecord
belongs_to :imageable, polymorphic: true
has_one_attached :picture
SIZES = { '400x400' => '400x400' }
def url(size)
return "https://placehold.it/#{size}" unless picture.attached?
'https://my_s3_subdomain.amazonaws.com/' +
picture.variant(resize: SIZES[size]).processed.key
end
...
end
如果有人有更好的方法做到这一点,我将很高兴看到它:)
https://stackoverflow.com/questions/50640231
复制相似问题