如何在Action Text中修改附件图片的磁盘存储尺寸?
解决Active Storage修改原始图片后元数据不匹配的完整性报错
你直接修改磁盘上的图片文件后,Active Storage的Blob记录里存储的元数据(文件大小、校验和)还是旧值,这就导致了完整性校验失败。解决的核心是更新Blob对应的元数据,步骤如下:
1. 重新计算并更新Blob的关键元数据
修改完图片文件后,执行以下代码更新Blob记录:
# 重新读取修改后的文件内容 file_content = File.binread(image_file_path) # 更新Blob的byte_size和checksum(完整性校验的核心字段) blob.update!( byte_size: file_content.size, checksum: OpenSSL::Digest::SHA256.base64digest(file_content) )
2. (可选)清除图片变体缓存
如果之前为该图片生成过变体(Variants),建议清除旧变体缓存,避免展示过时内容:
# 删除该Blob关联的所有变体记录 blob.variants.delete_all # 清除对应缓存键下的变体缓存 Rails.cache.delete_matched(/active_storage\/variants\/#{blob.key}/)
更稳妥的文件操作方式(替代直接路径操作)
直接调用service.send(:path_for)属于私有API,未来Rails版本可能变更。推荐用Active Storage官方提供的download/upload方法操作文件,适配所有存储服务(本地、S3等):
# 下载原始文件内容 original_content = blob.service.download(blob.key) # 处理图片 image = MiniMagick::Image.read(original_content) processed_image = ImageProcessing::MiniMagick.source(image) .resize_to_fit(width, height) .call # 重新上传覆盖原始文件 blob.service.upload(blob.key, processed_image) # 更新Blob元数据 blob.update!( byte_size: processed_image.size, checksum: OpenSSL::Digest::SHA256.base64digest(processed_image.read) )
内容的提问来源于stack exchange,提问作者Johan Donado B.
相关产品推荐
相关产品推荐

