You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5.2.0使用ActiveStorage attach图片报InvalidSignature错误求助

解决ActiveStorage ActiveSupport::MessageVerifier::InvalidSignature 错误

我一眼就看出问题出在你给attach方法传的参数上——你直接把图片的二进制数据(data.body)丢进去了,但ActiveStorage的attach并不接受纯二进制字符串,它会误以为你传的是已签名的Blob ID,自然就会触发签名验证失败的错误。

问题根源

当你调用listing.images.attach(pics)时,如果pics里是纯字符串(比如二进制图片数据),ActiveStorage会尝试调用ActiveStorage::Blob.find_signed去解析这个字符串,把它当作一个经过签名的Blob引用。但你的字符串是图片二进制,完全不是合法的签名格式,所以就抛出了InvalidSignature。

修复方案

你需要把每个图片的二进制数据包装成带有IO流、文件名和内容类型的哈希,让ActiveStorage知道这是要上传的文件,而不是已有的Blob引用。

修改你的代码中构建pics数组的部分:

# 记得先引入StringIO(如果没自动加载的话)
require 'stringio'

pics = []
photos.each_with_index do |data, index|
  # 把二进制数据包装成StringIO流,指定文件名和内容类型
  pics << {
    io: StringIO.new(data.body),
    filename: "#{listing.mlsid}_photo_#{index + 1}.jpg", # 生成唯一文件名
    content_type: 'image/jpeg' # 根据RETS返回的图片格式调整,比如png就改成image/png
  }
end
listing.images.attach(pics)

额外检查点

  1. 确认内容类型:如果RETS返回的图片不是JPEG,你可以尝试从data对象里获取正确的content type(比如有些RETS客户端会提供data.content_type属性),避免设置错误的类型导致后续问题。
  2. 验证密钥配置:虽然这个问题大概率不是密钥的问题,但如果修复后还是报错,可以检查config/secrets.yml或config/master.key(Rails 5.2+)里的secret_key_base是否正确,因为MessageVerifier依赖这个密钥生成/验证签名。

这样修改后,ActiveStorage就能正确创建Blob并保存图片了,不会再触发签名验证错误。

内容的提问来源于stack exchange,提问作者tomb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:16