Ruby on Rails如何处理XML上传 Active Storage怎么用

陌枫酱_2535

陌枫酱_2535

2026-03-22

1174人浏览

原创

Active Storage 默认不支持 XML 文件上传,因 Rails 7+ 的 content_type 白名单默认拦截 application/xml 和 text/xml;需在 config/initializers/active_storage.rb 中扩展 ActiveStorage.content_types_allowed_in_attachments 列表并保留原有类型。

ruby on rails如何处理xml上传 active storage怎么用

Active Storage 默认不支持 XML 文件上传?

Active Storage 本身不限制文件类型,但 Rails 默认的 content_type 白名单会拦截 application/xml 和 text/xml。你上传 XML 文件时可能遇到 ActiveStorage::InvariableError 或静默失败(实际没存进 Blob),根本原因是 Rails 7+ 对非图片/文本/音视频等“常规类型”做了默认过滤。

  • 检查日志里是否出现 Skipping Active Storage attachment: unsupported content type
  • 不是 Active Storage 不能存 XML,而是 ActiveStorage::Blob.create_after_upload! 被中间件提前拒绝了
  • 绕过方式不是改源码,而是显式声明允许类型

如何让 Active Storage 接收 XML 文件

在初始化配置中扩展允许的 MIME 类型列表。修改 config/initializers/active_storage.rb:

ActiveStorage.content_types_allowed_in_attachments = [
  "text/plain",
  "text/csv",
  "application/xml",
  "text/xml",
  "application/xhtml+xml",
  *ActiveStorage.content_types_allowed_in_attachments
]

注意:*ActiveStorage.content_types_allowed_in_attachments 必须保留,否则会丢失原有支持类型(如 PNG、PDF)。如果用的是 Rails config.active_storage.content_types_allowed_in_attachments,写法略有不同。

  • 重启应用后,has_one_attached :config_file 就能接收用户上传的 .xml 文件
  • 前端无需改 ,浏览器自动发送正确 Content-Type
  • 验证时可用 record.config_file.blob.content_type.in?(%w[application/xml text/xml])

上传后怎么安全读取 XML 内容

Active Storage 的 download 方法返回原始字节,直接传给 Nokogiri::XML 可能触发 XXE(外部实体攻击),尤其当 XML 来自不可信用户时。

  • 永远不要用 Nokogiri::XML(blob.download) —— 它默认启用外部实体解析
  • 必须禁用外部实体:用 Nokogiri::XML(blob.download, nil, nil, Nokogiri::XML::ParseOptions::NOENT)
  • 更稳妥的做法是先下载到临时文件再解析,避免内存爆涨(大 XML 文件):
Ox.parse
  • Active Storage 的优势在于统一接口(本地/ S3 / GCS 透明切换)、内置变体(虽 XML 不需要)、以及和 Action Text 的深度集成
  • 真正要注意的是:XML 不是二进制资源,别误用 representable 或试图生成预览图
  • 如果业务需要校验 XML Schema(XSD),务必在 after_commit 回调里做,而不是在控制器里阻塞上传流程

XML 文件体积小、结构固定、无渲染需求——Active Storage 是最省心的选择,前提是把 content_type 白名单和解析安全这两处补上。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Linux安装Ruby语言详细教程
Linux安装Ruby语言详细教程

本专题整合了Linux安装配置Ruby相关教程,阅读专题下面的文章了解更多详细操作。

2026.04.02

132

9

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

689

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

644

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

438

17

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

4784

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

6197

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2522

7

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3188

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5109

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习