Rails:Active Storage变体生成一个附加文件

时间:2019-03-20 06:48:07

标签: ruby ruby-on-rails-5 rails-activestorage

因此,在阅读官方文档后,我将以这种方式使用Active Storage变体

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">    
<style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">

问题是当我查看S3存储设备时,我注意到我拥有原始文件(例如,大小为22kb)和包含2kb文件的变体文件(已调整大小的文件)。

我在文档中知道说:

  

..”“当浏览器点击变体URL时,Active Storage将懒惰地   将原始Blob转换为指定的格式并重定向到   它的新服务位置。”

但是有什么方法可以防止Active Storage生成其他变体文件吗?就像制作变体一样,就是原始的。因此,我只有2kb,而不是S3中的24kb重复记录。

非常感谢!

编辑:

我设法解决了一些问题,如果有人遇到这个问题:

<%= image_tag user.avatar.variant(resize: "100x100") %>

创建一个帮助器,包括以下方法:

def resize_avatar2

  avatar_f = avatar.last
  if avatar_f.nil?
    return
  end

  resized_image = MiniMagick::Image.read(avatar_f.download)
  resized_image = resize_with_crop(resized_image, 300, 300)
  v_filename = avatar_f.filename
  v_content_type = avatar_f.content_type
  avatar.all.each { |imagen| imagen.purge }

  avatar.attach(
    io: File.open(resized_image.path),
    filename: v_filename,
    content_type: v_content_type)
end

1 个答案:

答案 0 :(得分:1)

如果您想用变体替换原始图片,我认为最好的方法是在上传图片之前调整图片大小。

例如使用DA_A查找临时文件的路径,在该文件上运行ffmpeg(有宝石),然后上传结果。

或者,您可以在作业中的图像上传后对其进行处理:

  • 在具有图像(params[:user][:avatar])的模型中,添加一个User
  • 然后使用after_create :resize_image的{​​{1}}方法
  • 然后在ImagesJob类(resize_image方法)中,您将:
    • 生成变体:ImagesJob.resize(self).perform_later(Rails的生成的URL,而不是S3的URL)
    • 获取图像:resize(user)(需要url = user.avatar.variant(resize: "100x100").url
    • 找到该变体的S3 URL,将其删除,找到原始图像URL,然后将其删除(您需要通过image = open(url).readrequire 'open-uri'表)。
    • ActiveStorage::Blob上传为新图像active_storage_blobs

(未经测试,但可能非常接近)