Rails中如何为has_many_attached关联添加文件类型和大小限制
Rails Active Storage 附件格式与大小限制实现方案
方案1:Rails 7+ 内置验证(推荐)
Rails 7及以上版本原生支持Active Storage附件验证,直接在User模型中添加验证规则即可:
class User < ApplicationRecord has_many_attached :resumes, dependent: :destroy # 附件验证规则 validates :resumes, content_type: { in: %w[ application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document application/pdf text/plain text/rtf application/rtf ], message: "仅支持上传doc、docx、pdf、txt、rtf格式的文件" }, size: { less_than: 2.megabytes, message: "单个文件大小不能超过2MB" } end
方案2:自定义验证方法(兼容Rails 6及更低版本)
如果使用的是Rails 6或更早版本,需要自行编写验证方法实现需求:
class User < ApplicationRecord has_many_attached :resumes, dependent: :destroy validate :validate_resumes private def validate_resumes # 没有上传附件时跳过验证 return unless resumes.attached? # 允许的文件MIME类型 allowed_types = %w[ application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document application/pdf text/plain text/rtf application/rtf ] max_size = 2.megabytes # 遍历校验每个上传的附件 resumes.each do |resume| # 格式校验 unless allowed_types.include?(resume.blob.content_type) errors.add(:resumes, "#{resume.filename} 格式不合法,仅支持doc、docx、pdf、txt、rtf") end # 大小校验 if resume.blob.byte_size > max_size errors.add(:resumes, "#{resume.filename} 大小超过2MB限制") end end end end
注意事项
- 不要仅依赖前端校验,后端校验是必须的安全防线,避免恶意请求绕过前端限制
- 上述验证基于文件实际MIME类型判断,比单纯校验文件后缀更安全,可以避免用户篡改后缀上传非法文件
- 如有更高安全要求,可以额外添加魔数检测判断文件真实类型,普通业务场景上述方案足够使用
内容的提问来源于stack exchange,提问作者r3b00t
相关产品推荐
相关产品推荐

