6

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

示例:Jon Smith 上传了他的头像,文件名为4321431-small.jpg. 在下载时,我想将文件重命名为jon_smith__headshot.jpg.

看法: <%= url_for user.headshot_file %>

url_for将从 Amazon S3 下载文件,但使用原始文件名。

我在这里有什么选择?

4

4 回答 4

6

内置控制器为 blob 提供存储的文件名。您可以实现一个自定义控制器,为它们提供不同的文件名:

class HeadshotsController < ApplicationController
  before_action :set_user

  def show
    redirect_to @user.headshot.service_url(filename: filename)
  end

  private
    def set_user
      @user = User.find(params[:user_id])
    end

    def filename
      ActiveStorage::Filename.new("#{user.name.parameterize(separator: "_")}__headshot#{user.headshot.filename.extension_with_delimiter}")
    end
end

从 5.2.0 RC2 开始,您不需要传递ActiveStorage::Filename; String您可以改为传递文件名。

于 2018-02-08T14:35:55.673 回答
5

我知道这已经得到解答,但我想添加第二种方法。您可以在保存用户对象时更新文件名。使用 OP 的user模型和headshot_file字段示例,您可以通过以下方式解决此问题:

# app/models/user.rb

after_save :set_filename

def set_filename
  file.blob.update(filename: "ANYTHING_YOU_WANT.#{file.filename.extension}") if file.attached?
end
于 2019-03-11T00:51:54.770 回答
2

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

  1. 它是短暂的(rails 团队不推荐)
  2. disk如果服务处于开发模式,它将不起作用。

它不适用于磁盘服务的原因是磁盘服务需要ActiveStorage::Current.host存在才能生成 URL。ActiveStorage::Current.host并被设置为,所以当被调用app/controllers/active_storage/base_controller.rb时它会丢失。service_url

到目前为止,ActiveStorage 提供了另一种访问附件 URL 的方法:

  1. 使用rails_blob_(url|path)(推荐方式)

但是如果你使用它,你只能提供content-disposition而不是文件名。

如果您config/routes.rb在 `ActiveStorage 存储库中看到,您将找到以下代码。

    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,仅此而已。

于 2019-04-05T08:21:21.300 回答
0

我还没有玩过 ActiveStorage,所以这有点像在黑暗中拍摄。

查看 S3 服务的 ActiveStorage,您似乎可以为上传指定文件名和处置。从指南看来,您可以rails_blob_path用来访问上传的原始 URL 并传递这些参数。因此,您可以尝试:

rails_blob_url(user.headshot_file, filename: "jon_smith__headshot.jpg")
于 2018-02-08T00:00:03.870 回答