有没有办法在下载时更改/设置文件名?

示例:乔恩·史密斯(Jon Smith)上传了他的头像,文件名是4321431-small.jpg。在下载时,我想将文件重命名为jon_smith__headshot.jpg

看法:<%= url_for user.headshot_file %>
url_for从Amazon S3下载文件,但使用原始文件名。

我在这里有什么选择?

最佳答案

@GuilPejon的方法将起作用。直接调用service_url的问题是:

  • 这是短暂的(Rails团队不推荐)
  • 如果服务在开发模式下是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/

    10-09 22:29