有没有办法在下载时更改/设置文件名?
示例:乔恩·史密斯(Jon Smith)上传了他的头像,文件名是4321431-small.jpg
。在下载时,我想将文件重命名为jon_smith__headshot.jpg
。
看法:<%= url_for user.headshot_file %>
此url_for
从Amazon S3下载文件,但使用原始文件名。
我在这里有什么选择?
最佳答案
@GuilPejon的方法将起作用。直接调用service_url
的问题是:
disk
,则它将不起作用。 对于磁盘服务不起作用的原因是,磁盘服务需要存在
ActiveStorage::Current.host
才能生成URL。并且ActiveStorage::Current.host
被设置为app/controllers/active_storage/base_controller.rb
,因此在调用service_url
时将丢失它。从现在开始,ActiveStorage提供了另一种访问附件URL的方法:
rails_blob_(url|path)
(推荐方式)但是,如果使用此选项,则只能提供
content-disposition
,而不能提供文件名。如果您在ActiveStorage存储库中看到
config/routes.rb
,则会找到以下代码。 get "/rails/active_storage/blobs/:signed_id/*filename" => "active_storage/blobs#show", as: :rails_service_blob
direct :rails_blob do |blob, options|
route_for(:rails_service_blob, blob.signed_id, blob.filename, options)
end
当您查看
blobs_controller
时,您会发现以下代码: def show
expires_in ActiveStorage::Blob.service.url_expires_in
redirect_to @blob.service_url(disposition: params[:disposition])
end
因此很明显,在
rails_blob_(url|path)
中,您只能传递disposition
,仅此而已。关于ruby-on-rails - S3上的Rails + ActiveStorage : Set filename on download?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48672728/