首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >亚马逊S3的活动存储没有使用指定的文件名进行保存,而是使用文件密钥

亚马逊S3的活动存储没有使用指定的文件名进行保存,而是使用文件密钥
EN

Stack Overflow用户
提问于 2018-06-01 17:27:06
回答 3查看 3.6K关注 0票数 6

我在使用活动存储时遇到问题。当我上传到亚马逊S3时,它不会将存储桶中的文件保存为原始名称(如myfile.zip ),而是将其保存为与该文件关联的key。所以在Cyberduck中,我看到了类似这样的东西:5YE1aJQuFYyWNr6BSHxhQ48t。不带任何文件扩展名。

我不确定Rails5中是否有一些设置,或者它是否在亚马逊S3中,但我花了几个小时在谷歌上搜索,以找出为什么会发生这种情况。

如果有任何建议,我们将不胜感激!

致以最好的问候,安德鲁

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-02 02:48:38

这是经过设计的,来自ActiveStorage。文件按其键存储,并且在S3上没有扩展名,但是当ActiveStorage生成URL时,disposition and filename are set

代码语言:javascript
复制
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的更多信息。

票数 7
EN

Stack Overflow用户

发布于 2018-09-03 12:27:41

您仍然可以使用filename accessor引用该名称。

代码语言:javascript
复制
class User < ApplicationRecord
  has_one_attached :photo
  ...
end

filename = User.first.photo.filename
票数 5
EN

Stack Overflow用户

发布于 2020-01-24 17:53:53

为了在S3上有一个自定义文件名,您应该同时更新blob.key和S3上的名称。

活动存储使用blob.key作为远程映像路径和名称,将映像上传到S3上。

对于我的用法,我只用一个猴子补丁更改了“图像变体”的名称,它允许生成一个以filename终止的key

config/initializers/active_storate_variant.rb

代码语言:javascript
复制
ActiveStorage::Variant.class_eval do
  def key
    "variants/#{blob.key}/#{Digest::SHA256.hexdigest(variation.key)}/#{filename}"
  end
end

因此,当我需要图像变量的公共url时,我只需调用image.url('400x400')

下面是我的Image模型的定制方式:

代码语言:javascript
复制
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

如果有人有更好的方法做到这一点,我将很高兴看到它:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50640231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档