问题描述
i = 0
params[:business][:images].map do |image|
decoded_image = Base64.decode64(image['image'])
image_io = StringIO.new(decoded_image)
@business.images.attach(io: image_io,filename: image['file_name'])
if i == 0
mm_image = MiniMagick::Image.open(@business.images.first)
mm_image.resize '300x200'
mm_image.format 'png'
cover_img = mm_image.path
cover_img_io = StringIO.new(cover_img)
@business.images.attach(io: cover_img_io,filename: 'cover.png')
end
i += 1
你好,我的目标是获取数组的第一张图片 (params[:business][:images]) 并使用 minimagik gem 调整其大小并将其重新格式化为 png 文件。我知道 @business.images.first 是一个活动的存储附件,因此几乎肯定不是应该传递给 MiniMagick::Image.open 的内容,但这是我所做的唯一一次不会引发错误的尝试。封面图像被保存到活动存储中,但显然不正确,因为当我通过浏览器导航到它时,它是一个白色方块,在我的应用程序中它根本不显示。我试图通过 MiniMagik::Image.open decoded_image、image_io 以及原始 base64 和所有这些方法导致错误。我不确定这些数据是什么,并且希望更好地理解,不仅可以解决这个问题,而且能够更好地解决我遇到的任何图像处理问题。文档示例使用文件名或 url,所以我也尝试过
first_image = rails_blob_url(@business.images.first,only_path: true)
mm_image = MiniMagick::Image.open(first_image)
但这让 Rails 对我大喊:
变量Errno :: ENOENT(没有这样的文件或目录@ rb_sysopen - /rails/active_storage/blobs/eyJfcmfpbHMiOnsibWVzc2FnZSI6IkJBaHBPdz09IiwiZXhwIjpudWxsLCJwdXIiOijibG9iX2lkIn19--41f5e0240265e5786b181f1fa1bb2a35d44c1254/IMG_1109.GIF):
我确信有一种更加优雅的方式来完成这项任务,请我接受所有建议。我的下一步是尝试使用回形针 gem,因为它似乎能够让您在创建记录之前执行这些操作以及在模型中运行验证,但如前所述,我想了解我在哪里这个 minimagick 代码出错了。做你自己的事
更新:
所以在玩这个 vscode copilot 时,我建议我做 cover_img = mm.image.to_blob 而不是 mm.image.path(+1 为 AI),并且奏效了!
但究竟什么是 blob,或者 io 或 base 64 呢?我讨厌 1000 行随机字母(base64 字符串)ruby 必须处理以保存这些图像。这些概念对于作为开发人员的理解是否重要,或者我不应该太担心它。我知道这不是谷歌,但我希望在“人类”而不是文档或技术博客文章中提供一些意见。我还没有为这个应用程序设置某种类型的文件存储,比如 aws 或 firebase,我已经预料到我这样做时会遇到问题,看看这将是我第一次这样做,对我来说理解高是有意义的平衡这些图像发生的情况。到目前为止,我的实施似乎是正确的?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)