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)
额外检查点
- 确认内容类型:如果RETS返回的图片不是JPEG,你可以尝试从
data对象里获取正确的content type(比如有些RETS客户端会提供data.content_type属性),避免设置错误的类型导致后续问题。 - 验证密钥配置:虽然这个问题大概率不是密钥的问题,但如果修复后还是报错,可以检查
config/secrets.yml或config/master.key(Rails 5.2+)里的secret_key_base是否正确,因为MessageVerifier依赖这个密钥生成/验证签名。
这样修改后,ActiveStorage就能正确创建Blob并保存图片了,不会再触发签名验证错误。
内容的提问来源于stack exchange,提问作者tomb
相关产品推荐
相关产品推荐

